Syntax 无点:不知道括号放在哪里

Syntax 无点:不知道括号放在哪里,syntax,ocaml,pointfree,Syntax,Ocaml,Pointfree,这是错误的,但我怎样才能使它明白,这个论点仍然有待提供?参数应为char list类型,即需要应用于它的第一个函数是(list.map(String.make 1)),然后将其传递给String.concat”“。我想我已经尝试了所有我能想到的括号组合。。。到目前为止还没有欢乐 帮忙 我还认为我可以这样做: let list_to_string = (String.concat "") (List.map (String.make 1));; 但我只是想确定没有更好的方法。我认为部分应用程序在

这是错误的,但我怎样才能使它明白,这个论点仍然有待提供?参数应为
char list
类型,即需要应用于它的第一个函数是
(list.map(String.make 1))
,然后将其传递给
String.concat”“
。我想我已经尝试了所有我能想到的括号组合。。。到目前为止还没有欢乐

帮忙

我还认为我可以这样做:

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

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

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

let ($) f g x = f (g x);;
let list_to_string = (String.concat "") $ (List.map (String.make 1));;
但这不是很有效,最好只创建一个字符串并用字符填充

如果您使用电池,请参阅;如果您使用Core,请参阅真正的(而且总是令人困惑的)问题是OCaml没有内置的函数组合运算符。因此,对于无点编码来说,开箱即用并不太好。如果你真的想对它感兴趣,你还需要
flip
,它可以反转两个参数函数的参数顺序

let list_to_string x = String.concat "" (List.map (String.make 1) x)
无论如何,一旦您将函数组合定义为
$
,我就看不出您的解决方案有任何问题。您可以省略一些括号:

let flip f a b = f b a
#让lts=String.concat”“$List.map(String.make 1);;
val lts:字符列表->字符串=

至于效率,我认为这更像是一个谜,而不是一段实用的代码。否则,您应该使用Edwin建议的函数。

您完全可以在OCaml中定义函数组合运算符。它不能是dot,因为它已经是OCaml中的一个操作符了

# let lts = String.concat "" $ List.map (String.make 1);;
val lts : char list -> string = <fun>
(* I just made up this symbol *)
let (^.^) f g x = f (g x)
let list_to_string = String.concat "" ^.^ List.map (String.make 1);;