1
SML(メタ言語)を初めて使用しています。 ( 'a - >' b) - >( 'bリスト - >' c) - > 'a - >' cリストSML:そのタイプから関数を解釈する
このタイプの関数をどのように派生させるか教えてもらえますか?私はSMLでカレー機能を理解するのに苦労しています。
SML(メタ言語)を初めて使用しています。 ( 'a - >' b) - >( 'bリスト - >' c) - > 'a - >' cリストSML:そのタイプから関数を解釈する
このタイプの関数をどのように派生させるか教えてもらえますか?私はSMLでカレー機能を理解するのに苦労しています。
これは
- fun f g h x = [h [g x]];
> val ('a, 'b, 'c) f = fn : ('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list
は、ここで私はそれをやった方法です動作します。私たちは、だから我々は、我々は3つのカリーの引数を持つ関数をしたい知っているタイプに
('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list
を与えられている
、最初の二つは関数であり、そして第三は何でもあります。だから我々は書く:
fun f g h x = ....
は今、最初の引数は、xがあるタイプ'a
、のようなものにとる関数であるので、我々は右側の
g x
をしたいです。そのタイプは'b
です。今h
は'b list
にかかるので、我々は
h [g x]
を書くことができます。これは、タイプ'c
の値を生成するが、我々はf
は'c list
を返すようにしたいので、私達はちょうどリストで、私たちが得ることを置く:
fun f g h x = [h [g x]];
質問を明確にすることはできますか?そのタイプの関数は無限に存在します。あなたはタイプを与えることはできませんし、 "このタイプを持つ関数を与える"と言うことができます。無限の数があります。しかし、他の方法を行くことは、動作します。 SMLで関数を記述すると、その型を計算することができます。おそらくあなたはそのタイプの_a_関数を探していますか?それはあなたが求めていることですか? –
こんにちは@RayToal、確かにそうです。このタイプを満たす限り、どのような関数でもかまいません。 また、その型から関数を推論する方法を説明することができれば幸いです。 –
私は次の3つのタイプがあることがわかります: 'a' b 'c fun foo a b c = b [a c]; これは間違いですが、このようなものでしょうか? –