题
这不是实际上的问题,但我想看看 隐性编程 在我的位置 无点 函数可以具有多个参数(不是以列表或元组的形式)。
其次,这样的功能如何操纵 复杂的数据结构. 。我在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]
, ,也避免变量。
不隶属于 StackOverflow