當你寫:
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
可以是任何東西。
因爲這是最一般的簽名。請注意'MkCompose'是一個構造函數。在第二個示例中,參數已經填入。 –
這裏的問題究竟是什麼? 'MkCompose'是一個構造函數,根據定義它是一個函數。究竟是什麼不清楚? – AJFarmar
啊哈。我很愚蠢。它不清楚爲什麼它顯示爲函數f(g x) - >編寫f g x'。 –