私はHaskellを学び始めます。チュートリアルを勉強しながら、私は算術式の関数の使用を可能にする次の例を見つけました:この例はうまくいきません。しかし、私はどのように(+)
関数が2つの引数の関数に変換されるのか理解できません。私はそれぞれ(+)
がfun2 (+)
に置き換えられていると理解しています。 fun2は1つの引数\t -> a t 'op' b t
の関数に相当しますが、2つの引数の関数((\t1 t2 -> (\x -> x) t1 + (\x -> x) t2)
のようなもの)が必要です。ここでは、Haskellの型定義の基本的な概念をいくつか適用する必要があると思いますが、それらが何であるか分かりません。ハスケル。 Num式の関数
EDIT 1
私はfun2
は3つの引数の関数であることを理解しています。私は内部表現の変換を理解できません。私は次のように推論しています:(+) 3 4
= (+) (\x->3) (\x->4)
= fun2 (+) (\x->3) (\x->4)
= \t -> (\x->3) t + (\x->4) t
これは何ですか?私の推論でどこが間違っていますか?別の方法で考える必要があるかもしれませんか?
EDIT 2
は、私が(おかげであなたのすべて!)私は、問題のいくつかの理解に達していると思います。だから、:
我々は
(+) 3 4
書く -Num
からこの場合の簡単な操作は、FunNat
からの特別な機能を使用されていません。FunNat
の(+)
を使用するには、fun2 (+) 3 4
またはfun2 (+) (\x -> 3) (\x -> 4)
と記述する必要があります。しかし、これらの式は、第3のパラメータが評価されることを期待しています。FunNat
の具体的な機能を示すには、((*)-(+))
(チュートリアルから引用)または他の形式 -(-) (*) (+)
を使用することができます。どちらの式も2つの引数をとります。この場合、私たちは:((*)-(+))
=fun2 (-) (*) (+)
=\t -> (*) t - (+) t
=\t -> (\t1 t2 -> t1 * t2) t - (\t1 t2 -> t1 + t2) t
=(\t t2 -> t * t2) - (\t t2 -> t + t2)
=\t t2 -> (t * t2) - (t + t2)
です。最終的な式はちょうどNum
であると想定しています。から取られた(私はそれがチュートリアルで説明したように、これらすべてが正しいことを願っていますが、
(t->a)
を期待fun2
ためのパラメータとして(*)
と(+)
を使用する可能性は、以下に基づいており、ために私は何を理解することはできませんチュートリアル):t1 -> t2 -> a
=t1->a'
a' = t2 -> a
。ここでカーリングが使用されます。
したがって、すべての必要な事実は表面上にありましたが、私は型推論の非自明なメカニズムを考慮しません。タイプで
'fun2(+)'は、定義によって '\ a b t - > a t + b t 'に相当します。これは本当に3つの引数の関数です - その型は 'Num a => {-1 - }(t - > a) - > {-2 - }(t - > a) - > {-3-} t - > a ' – user2407038
ありがとうございました。私は問題を明確にしようとします。 – DrDecay
@あなたの編集.. 't'はラムダによって束縛される変数です。 '(\ x - > 3)t'はちょうど' 3'なので、 '\ t - > 3 + 4'が最終式です。 – user2407038