2017-10-21 78 views
0

我有以下類型的構造函數和數據構造:類型簽名功能

data Compose f g x = MkCompose (f (g x)) 

獲取類型簽名約撰寫的前奏,它表明:

MkCompose :: f (g x) -> Compose f g x 

爲什麼它顯示的功能等?

當我申請的類型如下:

*ComposeExercise> :t MkCompose [[42]] 
MkCompose [[42]] :: Num x => Compose [] [] x 

那麼對於我來說,這是顯而易見的。

+0

因爲這是最一般的簽名。請注意'MkCompose'是一個構造函數。在第二個示例中,參數已經填入。 –

+1

這裏的問題究竟是什麼? 'MkCompose'是一個構造函數,根據定義它是一個函數。究竟是什麼不清楚? – AJFarmar

+0

啊哈。我很愚蠢。它不清楚爲什麼它顯示爲函數f(g x) - >編寫f g x'。 –

回答

4

當你寫:

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可以是任何東西。