0

私はそれを機能させるために括弧をどこに置くべきかについて頭を包むことができません:

let read_lines filename =
  let channel = open_in filename in
  Std.input_list channel;;

let print_lines filename =
  List.map print_string ((^) "\n") (read_lines filename);;

^これは私がこれまでに得たクローズです。私の用語があいまいである場合:((^) "\n")を部分関数と呼んでいます (すべての引数を処理するわけではないため)。print_string私が total 関数を呼び出すのは...まあ、すべての引数を処理するからです。

明らかに、私がしたいことは次のとおりです。

  1. List.map((^) "\n")最初にリストの要素に適用されます。
  2. List.mapprint_string#1 の結果に適用されます。

どのように?:)

4

2 に答える 2

1

いくつかのこと:List.map反復するだけでなく、(単位値の)リストを生成するため、おそらくあなたが望むものではありません。最初の引数である改行を先頭((^) "\n")に追加するため、おそらくあなたが望むものでもありません。(これは Haskell のようなセクションではなく、単純な部分適用です。)"\n"

これは、あなたが望むもの(私が思うに)に近い合理的な解決策です:

let print_lines filename =
  List.iter (fun str -> print_string (str ^ "\n")) (read_lines filename)

しかし、私はむしろ書きたい

let print_lines filename =
  List.iter (Printf.printf "%s\n") (read_lines filename)

これは、より明確で効率的です。

于 2013-10-01T10:34:47.490 に答える
1

多分あなたはそのようなものが欲しいですか?

# let ($) f g = fun x -> f(g x);;
val ( $ ) : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
# let f = print_string $ (fun s -> s^"\n");;
val f : string -> unit = <fun>
# List.iter f ["a";"b";"c";"d"];;
a
b
c
d
- : unit = ()
# let g = string_of_int $ ((+)1) $ int_of_string;;
val g : string -> string = <fun>
# g "1";;
- : string = "2"

括弧がないため、コードは機能しませんでした:

List.map print_string ((^) "\n") xs

として解析されます

(List.map print_string ((^) "\n")) xs

あなたが期待したとき

List.map (print_string ((^) "\n")) xs
于 2013-10-01T10:29:39.870 に答える