我正在浏览一个似乎是使用haskell和elm的网站的github项目。它使用运算符:~>
Browser Folder Uploading。我无法找到此运营商的定义。
它做什么?我为什么要用它?它叫什么?
答案 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