当你写:
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'。 –