将签名键入为函数

时间:2017-10-21 20:40:59

标签: haskell

我有以下类型构造函数和数据构造函数:

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

然后对我来说很明显。

1 个答案:

答案 0 :(得分: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可以是任何内容。