F#:“有趣”这个关键词有必要吗?

问题描述 投票:0回答:4

我正在输入“fun”关键字,然后我想起来在 C# 中不必这样做

这不是吗:

List.map (x -> x + 1) [1..10]

像这样富有表现力吗?:

List.map (fun x -> x + 1) [1..10]

这让我很好奇为什么“有趣”关键字是必要的。有人可以澄清为什么语法上需要“fun”关键字吗?

f# lambda
4个回答
23
投票

如果没有它,语言就会含糊不清。

let x y = y z -> y z

x
是在函数
y
上调用
z -> y z
还是忽略其参数并返回函数
y z -> y z


17
投票

已经有很多不错的推测性答案......我将添加到其中:

F# 有一个与 OCaml 兼容的核心语言,而 OCaml 使用“fun”。


0
投票

我只是想分享一下,现在(从 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


-1
投票

我知道作为柯里化的一部分,(参见这篇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 关键字。

© www.soinside.com 2019 - 2024. All rights reserved.