2017-04-07 66 views
2

我是Haskell的新手,在理解语言的一些概念时遇到了一些麻烦。haskell中表达式的类型

我有以下表现:

\f x → (f x,f 1)

而且从我的理解,我可以说:

  • 起初,我真的不能说是因为我什么˚F没有信息, 所以我说它可以是任何东西。

    然后,从(FX)的应用判断我可以说,它是类型的 功能A-> B,其中x ::一个

    然后从应用判断(F 1)I可以说一个是 整数类型,因此x是同一类型

然后,我真的不明白,为什么整个表达式的类型为:

(Integer → b) → Integer → (b, b)

我有一点猜测,我会说:

(Integer → b)是函数f的类型,所以它接收和整数并返回一个类型B

Integer是x的类型

(b b)是两个函数的调用类型吗?

有人可以指点我正确的方向吗?谢谢

+0

你明白了非常正确的。因为在GHCi中,文字'1'默认为'Integer',所以'\ f x - >(f x,f 1)'将被限制为'(整数 - > b) - >整数 - >(b,b)''。因此推断为函数的'f'需要一个'Integer'。由于'x'在元组元素之一传递给'f',所以'x'必须是'Integer'。 '(b,b)'只是一个元组,其中'b'是'f'的返回类型。 – bheklilr

+0

非常感谢!这是一个很好的解释!欣赏它。 –

+0

请您告诉我为什么这个'c b a = a b'的类型是'c :: t1 - >(t1 - > t) - > t'? @bheklilr –

回答

2

你是对的。

由于f适用于1 :: Integer,因此f :: Integer -> b

而且因为f也适用于x,所以x :: Integer

而且由于lambda的结果是f的应用程序的元组,因此结果类型为(b, b)

因此,lambda的类型是一种函数,它将f类型的东西加入到Integer(b, b)的元组中。

编辑

c b a = a b 

假设b :: t1

由于a适用于b,我们可以说a :: t1 -> t

由于c需要的bt1)类型的东西的at1 -> t)类型的东西的a应用的结果bt),我们可以说,c :: t1 -> (t1 -> t) -> t

+0

谢谢您的回答!我很感激。 @pat。请你善良,告诉我为什么这个'c :: t1 - >(t1 - > t) - > t'是'c b a = a b'的类型?这是我现在唯一不了解的事情。 –

+0

没有必要,我已经自己理解了,很抱歉打扰你。 –

4

整个lambda采用函数fx作为输入;它产生一对 ;该对的第一个元素是将f应用于x的结果,第二个元素是将f应用于1的结果。从f 1可知,对f的输入必须限于Num类型类。

getPair :: Num a => (a -> b) -> a -> (b, b) 
getPair =   \f   x -> (f x, f 1) 

唯一的限制是Num a =>

getPair id 8.9 => (8.9, 1.0) 
getPair (\x -> x > 0) (-9.8) => (False, True)