:~> 运算符在 haskell 中做什么

What does the :~> operator do in haskell

我正在浏览一个 github 项目,它似乎是一个使用 haskell 和 elm 的网站。它使用运算符 :~> in a type signature in this file。我找不到此运算符的定义。

它有什么作用?我为什么要用它?它叫什么?

这是一个类型的运算符。如果您查看 the file linked in the OP 的顶部,您将看到以下 pragma:

{-# LANGUAGE TypeOperators #-}

这意味着该语言不再是 'plain' Haskell,而是 Haskell 带有一些特定于 GHC 的扩展,其中之一是 Type Operators extension

此扩展基本上只允许您使用中缀运算符进行类型定义,而不仅限于字母数字类型名称。

正如 Chris Martin 在他的评论中指出的那样,这个特定类型的运算符来自 natural-transformation 包。它将 :~> 运算符定义为从一个函子到另一个函子的自然转换。

您可以像这样将其定义为普通 newtype

newtype NT f g x = NT (f x -> g x)

不过,使用类型运算符可以使函数签名类似于

SimpleApp -> SimpleHandler :~> Handler

读起来比

更像一个普通函数
SimpleApp -> NT (SimpleHandler Handler)

作为自然变换的示例,考虑 Data.Maybe 中的 listToMaybe。此功能有时也称为 safeHead,但重点是它是从 list ([]) 函子到 Maybe 函子的转换。

您可以 'promote' 像这样进行自然转换:

*Lib Lib Data.Maybe Control.Natural> safeHeadNT = wrapNT listToMaybe
*Lib Lib Data.Maybe Control.Natural> :t safeHeadNT
safeHeadNT :: [] :~> Maybe

请注意 safeHeadNT 的类型为 [] :~> Maybe

如果要调用函数可以重新解包:

*Lib Lib Data.Maybe Control.Natural> unwrapNT safeHeadNT [1,2,3]
Just 1
*Lib Lib Data.Maybe Control.Natural> unwrapNT safeHeadNT []
Nothing

另一种选择是使用包的内置 # 中缀运算符:

*Lib Lib Data.Maybe Control.Natural> safeHeadNT # []
Nothing
*Lib Lib Data.Maybe Control.Natural> safeHeadNT # [1,2,3]
Just 1