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)