点免费:困惑在哪里把括号(Point-free: confused about where to p

2019-10-18 01:24发布

let list_to_string = (String.concat "") (List.map (String.make 1));;

这是错误的,但我要如何让它明白的说法仍然是要提供? 该参数被预期为类型的char list ,即需要施加给它的第一功能是(List.map (String.make 1))然后将它传递到String.concat "" 。 我想,我已经试过括号我能想到的...没有喜悦,到目前为止的所有组合。

救命?

我也想我能做到这一点是这样的:

let ($) f g x = f (g x);;
let list_to_string = (String.concat "") $ (List.map (String.make 1));;

只是希望确保没有一个更好的办法。

Answer 1:

真正的(并且总是令人困惑的)问题是,OCaml中没有内置的函数组合操作。 因此,它不是那么好出去pointfree编码的方块。 如果你真的想要漂亮的吧,你还需要flip ,其反转的两个参数的函数的参数的顺序。

let flip f a b = f b a

无论如何,我不明白,一旦你定义的函数组合与解决方案的任何问题$ 。 您可以留下一些括号中:

# let lts = String.concat "" $ List.map (String.make 1);;
val lts : char list -> string = <fun>

至于效率,我想这是比代码的实践略偏一个谜。 否则,你应该使用埃德温提出的功能。



Answer 2:

我不认为这部分应用程序在这里帮助,只是写出来的功能参数:

let list_to_string x = String.concat "" (List.map (String.make 1) x)

这是不是很有效,虽然,这将是最好只创建一个字符串,用字符填充它。

如果使用电池再看看Batstring.of_list ,如果你使用的核心,然后看到String.of_char_list



Answer 3:

你绝对可以只是OCaml中定义一个函数组合操作。 这只是因为这是已经在OCaml的操作不能点。

(* I just made up this symbol *)
let (^.^) f g x = f (g x)
let list_to_string = String.concat "" ^.^ List.map (String.make 1);;


文章来源: Point-free: confused about where to put parenthesis