3

私は現在 Haskell を学んでおり、関数合成をいじろうとしています。

私は2つの関数を書きました。

let func1 x y = x + y

let func2 t = t*2

ただし、これら 2 つの関数を作成しようとすると、 func2 . func1 1 26 になると予想されます。

代わりに、次のエラーが表示されます。

   No instance for (Num (a -> b))
      arising from a use of `func1' at <interactive>:1:8-16
    Possible fix: add an instance declaration for (Num (a -> b))
    In the second argument of `(.)', namely `func1 1 2'
    In the expression: func2 . func1 1 2
    In the definition of `it': it = func2 . func1 1 2

これが機能しない理由を誰かが説明できますか?

4

3 に答える 3

4

関数の適用はどの演算子よりも優先されるため、構成は として解析されfunc2 . (func1 1 2)ます。つまり、コードfunc1 1 2は、関数であるかのように、結果である数値を構成しようとします。単項関数でのみ機能する(func2 . func1) 1 2ため、どちらも機能しないことに注意してください。(.)

実を言うと、私が個人的にあまり快適ではない方法で を使用するか、複数回使用することができます。しかし、この特定のケースでは、コンポジションをまったく使用しない方がおそらく良いでしょう。より少ない混乱で同じことをします。(func2 . func1 1) 2(.)func2 $ func1 1 2

于 2013-02-13T17:42:49.757 に答える
3

幸運な間違い(分配法則)により、これを行うことができますData.Function.on

import Data.Function

func1 x y = x + y
func2 t = t*2

func3 = func1 `on` func2

-- or just func3 = (+) `on` (2*)

ただし、一般的には、$この種の関数アプリケーションを使用する必要があります。これは実際にはコンポーズの仕事ではないので、コンポジションを使用する場合は、四角いペグを丸い穴に押し込もうとしています。

于 2013-02-13T17:50:33.843 に答える
1

あなたがやろうとしているのは、関数合成ではありません: に適用しようとしていますfunc1 1 2func2それが$演算子の目的です。

func2 $ func1 1 2
于 2013-02-13T17:43:04.187 に答える