6

这不是一个实际重要的问题,但我希望看到一个F# 中的默认编程示例,其中我的无点函数可以有多个参数(不是列表或元组的形式)。

其次,这些函数如何操作复杂的数据结构。我正在 F# Interactive 中尝试,但还没有成功。

例如,我尝试过:

> (fun _ -> (fun _ -> (+))) 333 222 111 555

这是正确的方式吗?

和:

> (fun _ -> (fun _ -> (+))) "a" "b" "c" "d";;  

val it : string = "cd"
4

2 回答 2

4

F# 不包含 Haskell 中可用的一些基本函数(主要是因为 F# 程序员通常更喜欢显式的编程风格,并且仅在不损害可读性的最明显的情况下使用无点风格)。

但是,您可以像这样定义一些基本组合器:

// turns curried function into non-curried function and back
let curry f (a, b) = f a b
let uncurry f a b = f (a, b)

// applies the function to the first/second element of a tuple
let first f (a, b) = (f a, b)
let second f (a, b) = (a, f b)

现在您可以使用组合器实现添加两个字符串长度的函数,如下所示:

let addLengths = 
  uncurry (( (first String.length) >> (second String.length) ) >> (curry (+)))

这构造了两个适用String.length于元组的第一个/第二个元素的函数,然后组合它们,然后使用添加元组的元素+。整个东西都被包裹起来了uncurry,所以你得到了一个 type 的函数string -> string -> int

于 2010-05-08T12:45:35.070 回答
2

在 F# 中,函数的数量是固定的,所以你不能同时编写

(op) 1 2

(op) 1 2 3 4

对于任何给定的运算符op。如果这是您想要的,您将需要使用列表或其他数据结构。如果你只是想避免命名变量,你总是可以做“1 + 2 + 3 + 4”。在 F# 中添加数字列表最惯用的方法是List.sum [1;2;3;4],这也避免了变量。

于 2010-05-08T15:45:36.157 回答