我正在输入“fun”关键字,然后我想起来在 C# 中不必这样做
这不是吗:
List.map (x -> x + 1) [1..10]
像这样富有表现力吗?:
List.map (fun x -> x + 1) [1..10]
这让我很好奇为什么“有趣”关键字是必要的。有人可以澄清为什么语法上需要“fun”关键字吗?
如果没有它,语言就会含糊不清。
let x y = y z -> y z
x
是在函数y
上调用z -> y z
还是忽略其参数并返回函数y z -> y z
?
已经有很多不错的推测性答案......我将添加到其中:
F# 有一个与 OCaml 兼容的核心语言,而 OCaml 使用“fun”。
我只是想分享一下,现在(从 f#8 开始)可以完全避免
fun
和 lambda ,至少在非常特定的情况下:当你的 lambda 只不过是一个原子表达式时(这意味着,当lambda 中的表达式在括号外没有任何空格,就像将多个柯里化参数传递给函数时一样。)
例如:
let exp1 = [{| X = 0; Y = 1; |}] |> List.distinctBy (fun x -> x.X)
let exp2 = ["A"; "B"; "C"] |> List.map (fun x -> x.ToLower())
let exp3 = List.map (fun x -> x.CompareTo(5)) [1..10]
现在可以写成:
let exp1 = [{| X = 0; Y = 1; |}] |> List.distinctBy _.X
let exp2 = ["A"; "B"; "C"] |> List.map _.ToLower()
let exp3 = [1..10] |> List.map _.CompareTo(5)
请注意,在
exp3
的情况下,我必须将数据参数传递到前面并通过管道传递函数,因此类型推断知道 _
在该上下文中是 int
。
我知道作为柯里化的一部分,(参见这篇post)你可以替换:
let countOneToTen = fun y List.map(fun x -> x + 1) y
countOneToTen = [1..10]
与
let countOneToTen y = List.map(fun x -> x + 1) y
countOneToTen = [1..10]
没有 fun 关键字。