2016-11-27 21 views
2

私は現在、Programming in Haskellという本(これは絶対に素晴らしい)ですが、運動4.8.8の問題に遭遇しました。HaskellのLuhn関数

タスクは(数字を倍増し、その結果が9より大きい場合9を減算)ヘルプ機能luhnDouble :: Int -> Intmod funcionを使用して、HaskellではLuhn algorithmを実現することです。

luhnDoubleの機能を実装することは問題ありませんでしたが、私はそれらの両方をタイプInt -> Int -> Int -> Int -> Boolの機能に持っていくことに苦労しています。私はそれを二つの方法をやって試してみました

は:

luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 then True 
       else False 

私は型エラーを受け取ります。

* Couldn't match expected type `(Integer -> Integer -> Integer) 
           -> Integer -> Integer' 
       with actual type `Int' 
* The function `(luhnDouble w) + x + (luhnDouble y) + z' 
    is applied to two arguments, 
    but its type `Int' has none 
    In the first argument of `(==)', namely 
    `(((luhnDouble w) + x + (luhnDouble y) + z) mod 10)' 
    In the expression: 
    (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 

しかし、私は、引数として機能する4 Int秒を与え、結果としてBoolを得ていないのですか?

luhn :: Int -> (Int -> (Int -> Bool)) 
luhn = \w ->(\x ->(\y -> (\z -> ((luhnDouble w) + x + (luhnDouble y) + z mod 10)))) 

しかし、私は、結果としてBool値を取得するには、ここでif式に持参するかどうかはわかりません。

私は、関数をカリー化と ラムダ式を使用してみました。

誰でも私を助け、私にこれを解決する方法のヒントを教えてください。

+0

そして、あなたの 'if'式が無効です。あなたは "else"の場合がありません。 – Carcigenicate

+0

ああ、忘れて申し訳ありません。私は今それを追加します! – TheCoolFrood

+3

そして、あなたは中置詞として 'mod'を使っていますが、バッククォートで囲まれていないので、引数として扱われています。それはおそらくあなたのエラーです。 – Carcigenicate

答えて

2
luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 then True 
  1. あなたはそれをifelseを与えませんでした。
  2. 接頭辞modは、`mod`の部分ではなく、呼び出しています。

修正:

luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) `mod` 10) == 0 
        then True 
        else False 

または

luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = if (mod ((luhnDouble w) + x + (luhnDouble y) + z) 10) == 0 
        then True 
        else False 

または、以下の冗長バージョン:

luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = (mod ((luhnDouble w) + x + (luhnDouble y) + z) 10) == 0 
+0

私は編集を追加しました。申し訳ありませんがあなたの意図と矛盾する場合。 – Carcigenicate