Здесь есть пара вещей:
Если вы сопоставляете шаблон с конструктором в качестве аргумента функции, вам нужно заключить его в круглые скобки, чтобы он анализировался так же, как вы как, например, x::xs
-> (x::xs)
У вас есть опечатка во втором предложении (makektuples
; дополнительные k)
Вы используете append (@
) для int * int
и (int * int) list
. Тип этой функции на самом деле 'a list * 'a list
, т. Е. Оба ее аргумента должны быть списками одного типа.
Мы могли бы пересмотреть это следующим образом:
fun maketuples [] = []
| maketuples (x::xs) = [(x, hd xs)] @ maketuples (tl xs)
Но добавление синглтона на самом деле не то, что вы должны делать. Почему? Лучше использовать минусы:
fun maketuples [] = []
| maketuples (x::xs) = (x, hd xs) :: maketuples (tl xs)
Мы можем исправить это еще немного, удалив вызовы hd
и tl
, просто уничтожив их в аргументах функции
fun maketuples [] = []
| maketuples (x::y::xs) = (x, y) :: maketuples xs
и, возможно, вы могли бы обработать ошибку лучше (одна возможность, за исключением):
fun maketuples [] = []
| maketuples (x::y::xs) = (x, y) :: maketuples xs
| maketuples _ = raise Fail "Not an even length list"