Ocaml 组成全部和部分函数

Ocaml 组成全部和部分函数,ocaml,composition,Ocaml,Composition,请不要回答 这是一个愚蠢的重复我真的想删除这个问题 谢谢 我不知道应该在哪里加括号才能让它工作: 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);; ^这是我到目前为止的最后一次。如果我的术语很模

请不要回答

这是一个愚蠢的重复我真的想删除这个问题

谢谢


我不知道应该在哪里加括号才能让它工作:

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”)
就是我所说的部分函数(因为它不能处理它的所有参数)<代码>打印字符串我调用total函数,因为。。。嗯,它处理所有的论点

显然,我希望发生的是:

  • List.map
    首先将
    ((^)”\n“
    应用于列表的元素
  • List.map
    print_string
    应用于#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
    可能不是您想要的,因为它将生成(单位值)列表,而不仅仅是迭代
    ((^)“\n”)
    可能也不是您想要的,因为它在换行符前面加了一个“\n”作为第一个参数。(这不是Haskell中的部分,而是一个简单的部分应用程序。)

    这里有一个合理的解决方案,接近(我认为)你想要的:

    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)
    

    更清晰、更高效。

    对不起,我刚才想我自己早就问过了,但完全忘了!你能帮我省去一些尴尬,删除答案,这样我也可以删除我的问题吗?请:)对不起,这只是一个示例,不需要函数(如假定的函数)。我也意识到我以前也问过类似的问题。如果你愿意的话,我不想把它们相乘。但我不能删除我自己的问题,因为到目前为止还有答案(好吧,也许我可以,但我不想)。所以我可以请你删除你的答案,这样我就可以删除我的问题了?请。可能的副本
    let print_lines filename =
      List.iter (Printf.printf "%s\n") (read_lines filename)