簡體   English   中英

:〜>運算符在haskell中做什么

[英]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)

作為自然轉換的示例,請考慮listToMaybeData.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM