Мл тип анализа функции сгиба
Может кто-нибудь объяснить мне, как определить тип следующей функции, сложите, как определено ниже?
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
по причинам, указанным выше.