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));;
但只是想确保没有更好的方法。
答案 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);;