我想将此 ML 代码转换为 F#。
fun take ([], i) = []
| take (x::xs, i) = if i > 0 then x::take(xs, i-1)
else [];
我试过这个
let rec take n i =
match n,i with
| [], i -> []
| x::xs, i -> if i > 0 then x::take(xs, i-1)
else [];
let val = 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 val = take ([1;2;3;4] 3)
但是它们都给了我一个错误 take.fs(7,5): error FS0010: Unexpected keywords 'val' in Binding
。 F# 代码有什么问题?
最佳答案
仅添加一些注释,我认为在 F# 中编写函数的最好方法是使用:
let rec take i n=
match n, i with
| [], i -> []
| _, i when i <= 0 -> []
| x::xs, i -> x::(take (i-1) xs)
我做了两处更改:
- 使用模式匹配来测试是否
i <= 0
(它与if
做同样的事情,但看起来更好一点) 颠倒参数的顺序,使最重要的参数(输入列表)成为最后一个。这使得可以通过管道操作符很好地使用该函数:
[1;2;3;4] |> take 3
关于f# - 通过翻译 ML 的等效项来使用 F# 实现 take,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6245982/