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

标签 f# sml ml take

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

相关文章:

f# - 如何在 F# 中为绘图卡建模

F# - 十六进制到 ASCII

sml - 标准 ML 类型中的问号意味着什么?

functional-programming - 使用 Hindley Milner 类型推断的 SML 中类型定义的增长

sml - 标准 ML 中的结构比较

sml - 如何在 ML 中拥有不止一种类型?

compiler-errors - 将内联与显式成员约束结合时出现奇怪的错误

f# - F# 中的循环函数/类型依赖

functional-programming - 如何访问元组的随机成员?

functional-programming - 通过查看第二个列表中的 bool 值来过滤一个列表的元素