我是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)
是被称为两个函数的类型?
有人能指出我正确的方向吗?谢谢
答案 0 :(得分:4)
整个lambda采用函数f
和x
作为输入;它产生
一双;该对的第一个元素是将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
采用t1
(a
)类型的某种类型t1 -> t
(a
)的结果将b
应用于t
(c :: t1 -> (t1 -> t) -> t
),我们可以说{{1}}。