无点:对于括号的放置位置感到困惑

时间:2013-04-20 11:58:18

标签: syntax ocaml pointfree

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

这是错误的,但我如何理解仍然要提供参数?该参数应该是char list类型,即I.e。需要应用的第一个函数是(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));;

但只是想确保没有更好的方法。

3 个答案:

答案 0 :(得分:1)

我不认为部分应用程序在这里有帮助,只需写出函数参数:

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

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

如果您使用电池,请参阅Batstring.of_list,如果您使用Core,请参阅String.of_char_list

答案 1 :(得分:1)

真正(并且总是令人困惑)的问题是OCaml没有内置的函数组合运算符。因此,开箱即用的无点编码并不是那么好。如果你真的想要使用它,你还需要flip,这会颠倒双参数函数的参数顺序。

let flip f a b = f b a

无论如何,一旦您将功能组合定义为$,我认为您的解决方案没有任何问题。你可以省略一些括号:

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

关于效率,我认为这更像是一个难题而不是实际的代码。否则你应该使用Edwin建议的功能。

答案 2 :(得分:0)

你绝对可以在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);;