ホーム>source

私は現在この本に取り組んでいますHaskellでのプログラミング (これはこれまでで本当に驚くべきことですが)、演習4.8.8で問題が発生しました。

タスクを実装することですLuhnアルゴリズム Haskellでは、ヘルプ関数 luhnDouble :: Int -> Int を使用(数字が2倍になり、結果が9より大きい場合は9が減算されます)および mod 機能。

luhnDouble の実装関数は問題ありませんでしたが、両方を Int -> Int -> Int -> Int -> Bool 型の関数に組み込むのに苦労しています 。

私はそれを2つの方法で試しました:

<前>ウィズウィズ

タイプエラーが表示されます。

<前>ウィズウィズ

しかし、私は機能を与えていません4 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 引数としてのsと * 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 の取得結果として?

次に、関数をカレー化して使用してみましたラムダ式

<前>ウィズウィズ

しかし、私は Int をどのように持ち込むかわかりませんここで Bool を取得する式結果として値。

誰かが私を助けて、私にこれをどのように解決できるかのヒントを教えてくれませんか?

luhn :: Int -> (Int -> (Int -> Bool)) luhn = \w ->(\x ->(\y -> (\z -> ((luhnDouble w) + x + (luhnDouble y) + z mod 10))))
あなたの答え
  • 解決した方法 # 1

    <前>ウィズウィズ

    あなたはそれに luhn :: Int -> Int -> Int -> Int -> Bool luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 then True を与えていません   else の後 。

    プレフィックス if を呼び出しています 、中置 mod ではない 。

    修正:

    <前>ウィズウィズ

    または

    <前>ウィズウィズ

    または、冗長性の低いバージョン:

    <前>ウィズウィズ

  • 解決した方法 # 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

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ mod proxy - Set-Cookieに無効な文字があるため、Apache ReverseProxy Netscaler Gatewayはリクエストを中止します