代码之家  ›  专栏  ›  技术社区  ›  Apocalisp

Unison中有类似Haskels的“$”吗?

  •  0
  • Apocalisp  · 技术社区  · 2 年前

    在Haskell中, f $ g a = f (g a) Unison中有这样的右关联运算符吗?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Apocalisp    2 年前

    有几个选择。

    1. 您可以使用 let 例如, f let g a f (g a) 这是因为 打开a block ,这是一系列语句。在这种情况下,块中唯一的语句是表达式 g a 该值成为块返回的值。所以你可以写例如。

      isSome let head let List.map increment [1,2,3]

    2. 有一个函数应用程序运算符:

      (base.Function.<|) : (a ->{e} b) -> a ->{e} b

      这样你就可以写作了 f <| g a 。但是,Unison没有任何运算符优先级规则,因此 所有操作员都在左边 。所以,如果你想做嵌套应用程序,比如

      isSome <| (head <| List.map increment [1,2,3])

      无论如何,你都需要使用括号。但是,由于所有运算符都关联到左侧,因此您可以只使用 |> 操作员改为:

      (base.Function.|>) : a -> (a ->{e} b) ->{e} b

      然后你可以写(翻转函数的顺序):

      [1,2,3] |> List.map increment |> head |> isSome

    3. 您可以使用函数组合:

      (base.Function.<<) : (b ->{e} c) -> (a ->{e} b) -> a ->{e} c

      这可以让你写作

      isSome << head << List.map increment <| [1,2,3]

      这相当于Haskell表达式:

      isJust . listToMaybe . map (+1) $ [1,2,3]

    推荐文章