簡體   English   中英

類型簽名作為功能

[英]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聲明的作用。

但是,當給它一個參數(因為它是一個函數)時,像下面這樣, fgx被賦予特定的類型:

λ> :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 = Maybeg = []x = Num n => n
  • MkCompose getLine :: Compose IO [] Char ,因為getLine :: IO [Char] 在這種情況下, f = IOg = []x = Char
  • MkCompose [[]] :: Compose [] [] x ,因為[[]] :: [[x]] 在這種情況下, f = []g = [] ,但是x可以是任何值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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