2015-10-13 3 views
1

Я хотел бы спросить, как []::[] и []::[]::[] концептуально интерпретируются в SML/NJ.Интерпретация [] :: [], [] :: [] :: [] в sml

Моя мысль:

Я думал, что []::[] бы генерирует ошибку или генерирует пустой список, но на самом деле он генерирует val it = [[]] : 'a list list.

После того как я знаю, что []::[] генерирует [[]] : 'a list list, я думал, что []::[]::[] будет генерировать [[[]]] : 'a list list list, но на самом деле он генерирует [[],[]] : 'a list list

+2

Вы знаете, как тип '::' оператора и его ассоциативность? – Bergi

+3

Возможно, вы захотите попробовать '([] :: []) :: []', чтобы увидеть, как он отличается от '[] :: ([] :: [])' (и что вы пытались) – Bergi

ответ

7

:: является правоассоциативной: В a::b::c::[] а, б, должны быть элементами одного и того же типа и

a::b::c::[] = a::(b::(c::[])) 
      = a::(b::[c]) 
      = a::[b,c] 
      = [a,b,c] 

Это верно, даже если, Ь, с []:

[]::[]::[]::[] = [[],[],[]]