这不是实际上的问题,但我想看看 隐性编程 在我的位置 无点 函数可以具有多个参数(不是以列表或元组的形式)。

其次,这样的功能如何操纵 复杂的数据结构. 。我在F#Interactive中尝试了一下,但还没有成功。

例如,我尝试了:

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

那是正确的方式吗?

和:

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

val it : string = "cd"
有帮助吗?

解决方案

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, ,因此您将获得类型的函数 string -> string -> int.

其他提示

在f#中,函数的敏锐度是固定的,因此您将无法同时编写两者

(op) 1 2

(op) 1 2 3 4

对于任何给定的操作员 op. 。如果您想要的话,您将需要使用列表或其他数据结构。如果您只是想避免命名变量,则可以始终执行“ 1 + 2 + 3 + 4”。在F#中添加数字列表的最惯用方法是 List.sum [1;2;3;4], ,也避免变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top