:~> 运算符在 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
我正在浏览一个 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