我正在浏览一个似乎是使用 haskell 和 elm 的网站的 github 项目。它:~>
在此文件的类型签名中使用运算符。我找不到该运算符的定义。
它有什么作用?我为什么要使用它?这叫什么?
我正在浏览一个似乎是使用 haskell 和 elm 的网站的 github 项目。它:~>
在此文件的类型签名中使用运算符。我找不到该运算符的定义。
它有什么作用?我为什么要使用它?这叫什么?
它是一个类型运算符。如果您查看OP 中链接的文件的顶部,您将看到以下杂注:
{-# LANGUAGE TypeOperators #-}
这意味着该语言不再是“普通”的 Haskell,而是带有一些 GHC 特定扩展的 Haskell,其中之一是Type Operators 扩展。
此扩展基本上只允许您使用中缀运算符进行类型定义,而不是仅限于字母数字类型名称。
正如 Chris Martin 在他的评论中指出的那样,这种特殊的类型运算符来自natural-transformation包。它将:~>
运算符定义为从一个函子到另一个函子的自然转换。
您可以像这样将其定义为正常的newtype
:
newtype NT f g x = NT (f x -> g x)
但是,使用类型运算符会生成类似的函数签名
SimpleApp -> SimpleHandler :~> Handler
读起来更像是一个正常的功能而不是
SimpleApp -> NT (SimpleHandler Handler)
作为自然变换的一个例子,考虑listToMaybe
从Data.Maybe
。此功能有时也称为safeHead
,但重点是它是从list ( []
) 函子到Maybe
函子的转换。
您可以将其“提升”为这样的自然转换:
*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