3

私は Haskell が初めてで、型システムに問題があります。私は次の機能を持っています:

threshold price qty categorySize
    | total < categorySize = "Total: " ++ total ++ " is low"
    | total < categorySize*2 = "Total: " ++ total ++ " is medium"
    | otherwise = "Total: " ++ total ++ " is high"
    where total =  price * qty

Haskell は次のように応答します。

No instance for (Num [Char])
      arising from a use of `*'
    Possible fix: add an instance declaration for (Num [Char])
    In the expression: price * qty
    In an equation for `total': total = price * qty
    In an equation for `threshold':
     ... repeats function definition

問題は、どういうわけか Haskell に total の型を伝え、それを型クラス Show に関連付ける必要があることだと思いますが、それを達成する方法がわかりません。助けてくれてありがとう。

4

2 に答える 2

10

total問題は、乗算の結果としてを定義することです。これにより、強制的に になり、それを文字列Num a => aの引数として使用して++、強制的に になります[Char]

total次のように変換する必要がありますString

threshold price qty categorySize
    | total < categorySize   = "Total: " ++ totalStr ++ " is low"
    | total < categorySize*2 = "Total: " ++ totalStr ++ " is medium"
    | otherwise              = "Total: " ++ totalStr ++ " is high"
    where total    = price * qty
          totalStr = show total

これで実行できますが、コードは少し繰り返しのように見えます。私は次のようなことを提案します:

threshold price qty categorySize = "Total: " ++ show total ++ " is " ++ desc
    where total = price * qty
          desc | total < categorySize   = "low"
               | total < categorySize*2 = "medium"
               | otherwise              = "high"
于 2013-03-29T17:39:13.567 に答える
3

問題は、文字列と数値の間で明示的に変換する必要があることです。Haskell は自動的に文字列を数値に強制変換したり、その逆を強制したりしません。

文字列として表示する数値を変換するには、 を使用しますshow

文字列を数値に解析するには、 を使用しますread。実際には多くの型に適用されるためread、次のように結果の型を指定する必要がある場合があります。

price :: Integer
price = read price_input_string
于 2013-03-29T17:43:06.533 に答える