gpt4 book ai didi

f# - 通过翻译 ML 的等效项来使用 F# 实现 take

转载 作者:行者123 更新时间:2023-12-02 08:30:22 26 4
gpt4 key购买 nike

我想将此 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com