来自 Real World OCaml ,第38页(请参阅https://realworldocaml.org/v1/en/html/variables-and-functions.html#prefix-and-infix-operators)。它定义了一个函数:
# let (|>) x f = f x ;;
并将其应用于字符串:
# let path = "/usr/bin:/usr/local/bin:/bin:/sbin";;
val path : string = "/usr/bin:/usr/local/bin:/bin:/sbin"
# String.split ~on:':' path
|> List.dedup ~compare:String.compare
|> List.iter ~f:print_endline
;;
/bin
/sbin
/usr/bin
/usr/local/bin
- : unit = ()
我想知道 - 操作员做了什么,真的吗?我感到困惑,因为List.iter
是一个函数而print_endline
也是一个函数。阅读代码时,我看不到String.compare
或List.dedup
在给定路径字符串上的位置。我一遍又一遍地读这本书,它说:
" 起初这个运算符的目的是什么并不是很明显:它只需要一个值和一个函数,并将函数应用于该值。尽管有着平淡无奇的描述,但它具有排序运算符的有用作用,与使用UNIX shell中的管道字符的精神相似。例如,考虑以下代码来打印出PATH的唯一元素。请注意,后面的List.dedup通过使用提供的比较函数对列表进行排序来从列表中删除重复项。 "
但为什么这两个功能会在" 路径"毕竟?有人可以开导我吗?
答案 0 :(得分:4)
嗯,您正在查看此运算符的完整定义。它需要一个值(在左侧)和一个函数(在右侧)并将该函数应用于该值。使用以|
开头的符号表示操作员与左侧相关联。因此a |> b |> c
相当于(a |> b) |> c
。
您似乎对高阶函数比|>
运算符更困惑。是的,List.iter
是一个函数,但它需要一个函数作为它的第一个参数。因此print_endline
也是一个函数也就不足为奇了。实际上List.iter ~f: print_endline
也是一个功能。此函数应用于表达式前一部分(列表)的值。这就是|>
的作用。
如果它有帮助,|>
旨在与Unix命令行的|
类似。您可以像管道一样指定初始值和一系列要应用的函数。