2013-12-12 2 views
0

У меня есть эта функция:Sml типа путаница

fun x (u,v,w) = (u::[v])::w; 

который получает тип возврата

fn: 'a * 'a * 'a list list -> 'a list list 

Может кто-нибудь объяснить мне, как этот тип генерируется из функции? Спасибо!

Редактировать: Также как я могу назвать эту функцию?

+3

Вы не должны заменять свой вопрос совершенно другим вопросом после того, как кто-то ответил на него. – newacct

+0

Я вернул это обратно к исходному вопросу. Если вы хотите задать новый вопрос, сделайте это вместо редактирования. – molbdnilo

+0

@OP: Это то, что называется выводом типа. Возможно, вы просто попросили людей объяснить вам, что такое тип вывода. – Hibou57

ответ

2

:: принимает два аргумента - один слева и один справа. Если его левый аргумент имеет тип t, то его правый аргумент должен быть типа t list.

Таким образом, :: имеет тип ('a * 'a list) -> 'a list, как t является произвольным, и, таким образом, представлен в 'a.

Если у вас есть код (u::[v]), поэтому, вы говорите, что SML u : t и 'v : t для некоторого типа t. Это выражение тогда равно t list, и поэтому для использования его в качестве левого аргумента в :: правильный аргумент w должен иметь тип t list list.

Это значит, что тип (u::[v])::w составляет t list list для некоторых t.

В итоге:
u : t
v : t
w : t list
(u::[v])::w : t list list,

все для некоторого типа t.

Таким образом, тип x равен ('a * 'a * 'a list) -> 'a list list, так как t является произвольным.

Чтобы вызвать эту функцию, вы можете сделать что-то вроде x(1,2,[3,4]), что дало бы список [[1,2],[3,4]].

+0

Когда я вызываю это, используя ваш пример, я получаю ошибку домена. Говорит операнд: int * int * int * list – user2796815

+0

никогда не бывало, я понял. Большое спасибо! – user2796815

Смежные вопросы