1
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));;

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

4

3 回答 3

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 建议的功能。

于 2013-04-20T15:08:03.547 回答
1

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

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

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

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

于 2013-04-20T14:12:24.750 回答
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);;
于 2013-04-20T23:06:21.637 回答