0

Haskellで、私はこれを試しました:

multi::(Num n)=>n->((a->a)->(a->a))
(multi 0) f x=x
(multi n) f x=(multi n-1) f (f x)

別の関数を何度も繰り返す関数を取得したいと考えています。ghciで私はこれを得ました:

[1 of 1] Compiling Main             ( pad.hs, interpreted )

pad.hs:2:8:
    Could not deduce (Eq n) arising from the literal `0'
    from the context (Num n)
      bound by the type signature for
                 multi :: Num n => n -> (a -> a) -> a -> a
      at pad.hs:1:8-35
    Possible fix:
      add (Eq n) to the context of
        the type signature for multi :: Num n => n -> (a -> a) -> a -> a
    In the pattern: 0
    In an equation for `multi': multi 0 f x = x

pad.hs:3:23:
    Could not deduce (Num ((a -> a) -> a -> a))
      arising from a use of `-'
    from the context (Num n)
      bound by the type signature for
                 multi :: Num n => n -> (a -> a) -> a -> a
      at pad.hs:1:8-35
    Possible fix:
      add an instance declaration for (Num ((a -> a) -> a -> a))
    In the expression: multi n - 1
    In the expression: (multi n - 1) f (f x)
    In an equation for `multi': multi n f x = (multi n - 1) f (f x)
Failed, modules loaded: none.

私はハスケルの初心者です。私は何をしますか?

4

4 に答える 4

4

カップルのもの。Nums が等しいかどうかをチェックすることはできません。あなたはおそらくを探していIntます。次に、multi を囲む括弧は必要ありません。これは引数です。そして、いくつかの他のフォーマット。

multi :: Int -> (a -> a) -> a -> a
multi 0 f x = x
multi n f x = multi (n-1) f (f x)

この型シグネチャをより汎用的にすることもできますが、そのままにしておきます。しかし、このすべてを高階関数で書くことができます。

multi :: Int -> (a -> a) -> a -> a
multi n f a = foldl (\v _ -> f v) a [1..n]
于 2013-10-31T21:24:05.753 に答える
2

あなたはほとんどそれをしました。最小限の修正は、括弧を追加n - 1して署名を削除することです。

(multi 0) f x=x
(multi n) f x=(multi (n-1)) f (f x)
于 2013-10-31T21:22:31.763 に答える
2

プログラムをコンパイルできるようにするために私ができる最小の変更は次のとおりです。

multi::(Eq n, Num n)=>n->((a->a)->(a->a))
(multi 0) f x=x
(multi n) f x=(multi (n-1)) f (f x)

型クラスでは、Numメンバーが既に のメンバーである必要はないためEq、それも指定する必要があります。n-1さらに、引数としてに渡したいと思いますmulti

この問題は通常、Haskell ランドでiterateandを使用して行われ!!ます。

于 2013-10-31T21:25:24.510 に答える