1

我正在浏览一个似乎是使用 haskell 和 elm 的网站的 github 项目。它:~> 在此文件的类型签名中使用运算符。我找不到该运算符的定义。

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

4

1 回答 1

2

它是一个类型运算符如果您查看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)

作为自然变换的一个例子,考虑listToMaybeData.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
于 2018-04-14T18:39:00.947 回答