Поскольку val
является зарезервированным ключевым словом в F #, его нельзя использовать в качестве значения. Ваша первая версия take
неверна, потому что тип take(xs, i-1)
(форма кортежа) отличается от типа take n i
(форма карри). Это работает:
let rec take n i =
match n, i with
| [], i -> []
| x::xs, i -> if i > 0 then x::(take xs (i-1)) else []
let value = take [1;2;3;4] 3
Вторая версия имеет ошибку в том, как вы вызываете функцию. Это можно исправить следующим образом:
let rec take input =
match input with
| [], i -> []
| x::xs, i -> if i > 0 then x::take(xs, i-1) else []
let value = take ([1;2;3;4], 3) // Notice ',' as tuple delimiter
Или вы можете написать еще ближе к своей функции ML:
let rec take = function
| [], i -> []
| x::xs, i -> if i > 0 then x::take(xs, i-1) else []
let value = take ([1;2;3;4], 3)