haskell中表达式的类型

时间:2017-04-07 14:13:44

标签: haskell types

我是Haskell的新手,我在理解该语言的一些概念方面遇到了一些麻烦。

我有以下表达式:

\f x → (f x,f 1)

根据我的理解,我可以这样说:

  • 起初,我无法真正说出是什么,因为我没有信息, 所以我说它可以是任何东西。

    然后从(f x)的应用来判断,我可以说它是一个 类型a-> b的函数,其中x :: a

    然后根据(f 1)的应用判断,我可以说a是 输入Integer,因此x是相同的类型

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

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

我有点猜测,我会说:

(Integer → b)是函数f的类型,因此它接收并返回整数并返回类型b

Integer是x

的类型

(b b)是被称为两个函数的类型?

有人能指出我正确的方向吗?谢谢

2 个答案:

答案 0 :(得分:4)

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

Num

唯一的限制是getPair :: Num a => (a -> b) -> a -> (b, b) getPair = \f x -> (f x, f 1)

Num a =>

答案 1 :(得分:2)

你是对的。

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

由于x也适用于x :: Integer,因此f

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

因此lambda的类型是一个函数,它将Integer类型的函数带到一个将(b, b)转换为c b a = a b 元组的函数。

修改

b :: t1

假设a

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

由于b采用t1a)类型的某种类型t1 -> ta)的结果将b应用于tc :: t1 -> (t1 -> t) -> t),我们可以说{{1}}。