1

以下に定義されているように、次の関数、foldのタイプを理解する方法を誰かが私に説明できますか?

fun fold func [] base = base
|   fold func (x::xs) base = fold func xs (func x base);

私の答えは'c->'a list->'b->' bですが、コードをSMLプログラムにプラグインした後、タイプは実際には('a->' b->'b)であることがわかります。 ->'リスト->'b->'b。

'a list->' b->'bがどこから来ているのかは理解していますが、最初の部分は私を混乱させています。funcが'aと'bの2つの引数を取り、ベースのタイプである'bを返すためですか?

どんな助けでも大歓迎です。

4

1 に答える 1

1

func が 'a と a 'b の 2 つの引数を取り、base の型である 'b を返すからですか?

はい、正確に。

最初の部分が'c最初に想定したとおりであれば、最初の引数foldが任意の値になる可能性があることを意味します-intたとえば。intへの最初の引数として (または関数ではない他のもの)を渡すことは明らかに合法的ではないfuncため、最初の引数には、この引数に対してのみ関数を許可するように型システムに指示する型が必要です。

実際には、関数だけを許可するのではなく、適切なタイプの関数のみを許可する必要があります。そして、適切なタイプfunc'a -> 'b -> 'b、上記の理由によるものです。

于 2012-11-06T13:35:01.527 に答える