SORU
18 Mart 2010, PERŞEMBE


Dize/Haskell içinde Yüzer Tamsayı dönüştürmek?

data GroceryItem = CartItem ItemName Price Quantity | StockItem ItemName Price Quantity

makeGroceryItem :: String -> Float -> Int -> GroceryItem
makeGroceryItem name price quantity = CartItem name price quantity  

Bir Dize kullanarak veya [String] Groceryİtem oluşturmak istiyorum

createGroceryItem :: [String] -> GroceryItem
createGroceryItem (a:b:c) = makeGroceryItem a b c

Giriş biçiminde olacak ["","15.00",""] 5 Yukarı kullanarak kelimeler haskell işlevi kırdım. Apple Bu makeGroceryİtem bir Şamandıra kabul ettiğinden ve bir İnt bence bu hata alıyorum. Ama nasıl b ve c Şamandıra yapabilirim ve sırasıyla İnt?

*Type error in application
*** Expression     : makeGroceryItem a read b read c
*** Term           : makeGroceryItem
*** Type           : String -> Float -> Int -> GroceryItem
*** Does not match : a -> b -> c -> d -> e -> f*

Önceden:) çok teşekkürler

CEVAP
18 Mart 2010, PERŞEMBE


read yüzer ve int içine bir dize ayrıştırmak

Prelude> :set  t
Prelude> read "123.456" :: Float
123.456
it :: Float
Prelude> read "123456" :: Int
123456
it :: Int

Ama sorun (1) desen:

createGroceryItem (a:b:c) = ...

Burada : bir listeye öğe başa (sağ çağrışımlı) ikili bir operatör. Bir öğenin OLUŞTURDUĞU bir liste olmalı. Bu nedenle, ifade verildi a:b:c Haskell aşağıdaki türleri sonucuna:

a :: String
b :: String
c :: [String]

yani c dizeleri bir liste olarak düşünülebilir. Belli ki read veya herhangi bir fonksiyon bir Dize bekliyor geçmiş.

Bunun yerine kullanmalısınız

createGroceryItem [a, b, c] = ...

eğer bu liste tam 3 öğe olması gerekir, ya da

createGroceryItem (a:b:c:xs) = ...

≥3 ise öğeleri kabul edilebilir.

Ayrıca (2), deyim

makeGroceryItem a read b read c

hangi makeGroceryItem 5 bağımsız, 2 olarak yorumlanacaktır read işlevi vardır. Parantez kullanmanız gerekir:

makeGroceryItem a (read b) (read c)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • aki6336

    aki6336

    14 AĞUSTOS 2008
  • Ionized Digital Air Studios

    Ionized Digi

    20 HAZİRAN 2009
  • We've moved!

    We've moved!

    7 Ocak 2008