[英]What does the :~> operator do in haskell
我正在瀏覽一個github項目,該項目似乎是使用haskell和elm的網站。 它在此文件的類型簽名中使用運算符:~>
。 我找不到該運算符的定義。
它有什么作用? 我為什么要使用它? 這叫什么?
這是一個類型運算符 。 如果您查看OP中鏈接的文件的頂部,則會看到以下編譯指示:
{-# LANGUAGE TypeOperators #-}
這意味着該語言不再是“普通的” Haskell,而是具有某些GHC特定擴展的Haskell,其中之一是類型運算符擴展 。
此擴展基本上僅使您可以使用中綴運算符進行類型定義,而不僅限於字母數字類型名稱。
就像克里斯·馬丁(Chris Martin)在評論中指出的那樣,這種特殊的類型運算符來自於自然變換包。 它將:~>
運算符定義為從一個函子到另一個函子的自然轉換。
你本可以將它定義為一個正常的newtype
是這樣的:
newtype NT f g x = NT (f x -> g x)
但是,使用類型運算符會使函數簽名像
SimpleApp -> SimpleHandler :~> Handler
讀起來更像是普通函數,而不是
SimpleApp -> NT (SimpleHandler Handler)
作為自然轉換的示例,請考慮listToMaybe
的Data.Maybe
。 此功能有時也稱為safeHead
,但要點是它是從列表 ( []
) safeHead
函數到Maybe
safeHead
函數的轉換。
您可以將其“促進”為這樣的自然轉變:
*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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.