Мл тип анализа функции сгиба

Может кто-нибудь объяснить мне, как определить тип следующей функции, сложите, как определено ниже?

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 и a, и возвращает тип базы, который равен b?

Любая помощь будет принята с благодарностью.

1 ответ

Решение

Это потому, что func принимает два аргумента, a и a, и возвращает тип базы, который равен b?

Да, точно.

Если бы первая часть была просто 'c как вы сначала предполагали, это будет означать первый аргумент fold может быть любое значение - int например. Ясно, что не должно быть законным int (или что-то еще, что не является функцией) в качестве первого аргумента funcпоэтому первый аргумент должен иметь тип, который сообщает системе типов разрешать функции только для этого аргумента.

И на самом деле он должен позволять не только какие-либо функции, но только функции соответствующего типа. И соответствующий тип для func является 'a -> 'b -> 'b по причинам, указанным выше.

Другие вопросы по тегам