2017-10-21 61 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可以是任何东西。