我有以下类型构造函数和数据构造函数:
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
然后对我来说很明显。
答案 0 :(得分:4)
当你写:
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
可以是任何内容。