[英]Type signature as function
我有以下類型構造函數和數據構造函數:
data Compose f g x = MkCompose (f (g x))
在關於Compose的序言中獲取類型簽名,它顯示:
MkCompose :: f (g x) -> Compose f g x
為什么顯示為函數?
當我應用如下類型時:
*ComposeExercise> :t MkCompose [[42]]
MkCompose [[42]] :: Num x => Compose [] [] x
那么對我來說,這很清楚。
當你寫:
data Compose f g x = MkCompose (f (g x))
您是在說:
MkCompose :: f (g x) -> Compose f g x
那就是Compose
的定義; 這就是data
聲明的作用。
但是,當給它一個參數(因為它是一個函數)時,像下面這樣, f
, g
和x
被賦予特定的類型:
λ> :t MkCompose [[1]] -- f = [], g = [], x = Num n => n.
MkCompose 1 :: Num n => Compose [] [] n -- As in the definition.
正是因為MkCompose
是一個函數,所以它具有函數類型。 它需要一個值並返回另一個。
如果不清楚,請參見以下其他示例:
MkCompose (Just [1]) :: Num n => Compose Maybe [] n
,因為Just [1] :: Num n => Maybe [n]
。 在這種情況下, f = Maybe
, g = []
和x = Num n => n
。 MkCompose getLine :: Compose IO [] Char
,因為getLine :: IO [Char]
。 在這種情況下, f = IO
, g = []
和x = Char
。 MkCompose [[]] :: Compose [] [] x
,因為[[]] :: [[x]]
。 在這種情況下, f = []
, g = []
,但是x
可以是任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.