什么是:〜>运营商在哈斯克尔做

时间:2018-04-09 20:35:23

标签: haskell types functional-programming servant

我正在浏览一个似乎是使用haskell和elm的网站的github项目。它使用运算符:~> Browser Folder Uploading。我无法找到此运营商的定义。

它做什么?我为什么要用它?它叫什么?

1 个答案:

答案 0 :(得分:0)

这是类型的运算符。如果您查看the file linked in the OP的顶部,您会看到以下编译指示:

{-# LANGUAGE TypeOperators #-}

这意味着该语言不再是“普通的”Haskell,而是具有一些GHC特定扩展的Haskell,其中一个是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)

作为自然转型的一个例子,请考虑listToMaybe中的Data.Maybe。此功能有时也称为safeHead,但关键是它是从列表[])仿函数到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