什么是|>做?

时间:2014-05-19 21:59:21

标签: operators ocaml

来自 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.compareList.dedup在给定路径字符串上的位置。我一遍又一遍地读这本书,它说:

" 起初这个运算符的目的是什么并不是很明显:它只需要一个值和一个函数,并将函数应用于该值。尽管有着平淡无奇的描述,但它具有排序运算符的有用作用,与使用UNIX shell中的管道字符的精神相似。例如,考虑以下代码来打印出PATH的唯一元素。请注意,后面的List.dedup通过使用提供的比较函数对列表进行排序来从列表中删除重复项。 "

但为什么这两个功能会在" 路径"毕竟?有人可以开导我吗?

1 个答案:

答案 0 :(得分:4)

嗯,您正在查看此运算符的完整定义。它需要一个值(在左侧)和一个函数(在右侧)并将该函数应用于该值。使用以|开头的符号表示操作员与左侧相关联。因此a |> b |> c相当于(a |> b) |> c

您似乎对高阶函数比|>运算符更困惑。是的,List.iter是一个函数,但它需要一个函数作为它的第一个参数。因此print_endline也是一个函数也就不足为奇了。实际上List.iter ~f: print_endline也是一个功能。此函数应用于表达式前一部分(列表)的值。这就是|>的作用。

如果它有帮助,|>旨在与Unix命令行的|类似。您可以像管道一样指定初始值和一系列要应用的函数。