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));;
只是希望确保没有一个更好的办法。
真正的(并且总是令人困惑的)问题是,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>
至于效率,我想这是比代码的实践略偏一个谜。 否则,你应该使用埃德温提出的功能。
我不认为这部分应用程序在这里帮助,只是写出来的功能参数:
let list_to_string x = String.concat "" (List.map (String.make 1) x)
这是不是很有效,虽然,这将是最好只创建一个字符串,用字符填充它。
如果使用电池再看看Batstring.of_list ,如果你使用的核心,然后看到String.of_char_list
你绝对可以只是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);;