2017-08-13 14 views
-2

私はdata.maybeタイプを使用しようとしましたが失敗しました。私はghciでそれを実行しようとすると、 "コンストラクタ 'Ramen'は引数を持たず、1を与えられているはずです。"どうすれば修正できますか?ghc-modi `type`コマンドを実行中にエラーが発生しました:

data Product = Ramen | Chips 

totalPrice :: Product -> Integer -> Float 

totalPrice product = case product of 
       Ramen x 
        | x >= 200 -> 1.35*x 
        | x <= 200 -> 1.4*x 
        | x <= 100 -> 1.5*x 
        | x <= 30 -> 1.8*x 
        | x <= 10 -> 2.0*x 
        | otherwise -> error "Something's wrong." 
       Chips x 
        | x >= 21 -> 2.35*x 
        | x <= 20 -> 2.5*x 
        | x <= 10 -> 2.7*x 
        | x <= 5 -> 2.95*x 
        | x >= 1 && x <= 2 -> 3.0*x 
        |otherwise -> error "Something's wrong." 

答えて

1

問題は、コンパイラが言うまさにである:

The constructor ‘Ramen’ should have no arguments, but has been given 1. 

RamenChipsが定義data Product = Ramen | Chipsを持っていますが、case式(Ramen xChips x)で引数を受け取ります。どちらの

Ramen xChips xだけRamenChipsへの変更と関数定義にxを移動したり、data Product = Ramen Integer | Chips Integerにあなたのデータコンストラクタを変更し、totalPrice :: Product -> Integer -> Floatの外にIntegerを移動:コンパイルエラーを修正するためには、あなたが必要となります。おそらく、最初の選択肢がより適しています。

しかし、この問題を修正した後、あなたは別のものを得るでしょう:

Couldn't match expected type ‘Float’ with actual type ‘Integer’ 

それはfromIntegral :: (Num b, Integral a) => a -> bを用いて固定することができます。

これはコンパイルエラーを修正するはずですが、totalPrice Ramen 10を呼び出した後は結果として14.0が返されますが、私はあなたが20.0を予期していると想定しています。これは、はx >= 200 -> 1.35*xで失敗しますが、成功したのはx <= 200 -> 1.4*xです。

次の例では、コンパイルして返します。

200 * 1.35 on totalPrice Ramen 200 
150 * 1.4 on totalPrice Ramen 150 
and 
10 * 2.0 on totalPrice Ramen 10 

をしかし、私はちょうど0countが負である返すHaskellerror、どの程度を使用することをお勧めしていないと思いますか?

totalPrice :: Product -> Integer -> Float  
totalPrice product count = case product of 
       Ramen 
        | x >= 200 -> 1.35*x 
        | x > 100 -> 1.4*x 
        | x > 30 -> 1.5*x 
        | x > 10 -> 1.8*x 
        | x >= 0 -> 2.0*x 
        | otherwise -> 0 
       Chips 
        | x >= 21 -> 2.35*x 
        | x > 10 -> 2.5*x 
        | x > 5 -> 2.7*x 
        | x > 2 -> 2.95*x 
        | x >= 0 -> 3.0*x 
        | otherwise -> 0 
    where x = fromIntegral count 
+0

あなたの助言に感謝します。 –

関連する問題