2016-12-05 19 views
0

プログラミングの改訂中私は頭の中で型推論を行うことでほとんどのことを行うことができますが、私はそれをとてもうまく使っていますが、私に困ってしまう問題が1つあります。標準MLの(a - >( 'b - >' c)) - >( 'a - >' b) - >( 'a - >' c)の関数

Iタイプの機能を記述する必要があり:

( ' - >(' B - > C ')) - >(' - > 'B) - >(' - > 'c)

私の頭では、関数fとgの2つの引数を持つ関数が必要です。どちらも引数xをとりますが、この引数xは2つの引数しか取らないため、この関数に引数xを追加することはできません。パイプライニング関数のo演算子を使用してこの関数を作成します。

fは引数をとり、関数を返します。 gは引数をとり、値を返します。 全体関数は値を取り、値を返します。

私はfとgをどのように適用して、o演算子だけを使ってそれらの規則を暗示することはできません。

すべてのヘルプは非常にいただければ幸いです:) おかげで、シアラン

答えて

1

をすでに述べたように、次の2つの引数の関数で記述する必要があります。

fun my_function f g = body 

f : 'a -> 'b -> 'cg : 'a -> 'bbody : 'a -> 'cを。

body'a -> 'cを入力しているので、我々は

body''cx : 'aを入力してい
body = fn x => body' 

としてそれを書くことができます。 (f x) (g x)

は、あなたがタイプ'b -> 'cとタイプ'bの値の関数を持っている場合f x : 'b -> 'cg x : 'b、それは引数に関数を適用することにより、タイプ'cの値を構築するために簡単だことを、確認します。

上記は、私たちを与える:

fun my_function f g = fn x => (f x) (g x) 

、あるいは、我々が得る定義の左側にx移動:

fun my_function f g x = f x (g x) 

ところで、あなたが精通している場合combinatory logicの場合、結果の関数はSコンビネータを表していることがわかります。

+0

これは素晴らしいです! ありがとう、非常に便利で、これらの質問、歓声について私が考える方法を変えました。 – user2930356

+0

喜んで:) –

関連する問題