haskell中表达式的类型
我是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)
是两个函数的调用类型吗?
有人可以指点我正确的方向吗?谢谢
你是对的。
由于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
需要的b
(t1
)类型的东西的a
(t1 -> t
)类型的东西的a
应用的结果b
(t
),我们可以说,c :: t1 -> (t1 -> t) -> t
。
谢谢您的回答!我很感激。 @pat。请你善良,告诉我为什么这个'c :: t1 - >(t1 - > t) - > t'是'c b a = a b'的类型?这是我现在唯一不了解的事情。 –
没有必要,我已经自己理解了,很抱歉打扰你。 –
整个lambda采用函数f
和x
作为输入;它产生一对 ;该对的第一个元素是将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)
你明白了非常正确的。因为在GHCi中,文字'1'默认为'Integer',所以'\ f x - >(f x,f 1)'将被限制为'(整数 - > b) - >整数 - >(b,b)''。因此推断为函数的'f'需要一个'Integer'。由于'x'在元组元素之一传递给'f',所以'x'必须是'Integer'。 '(b,b)'只是一个元组,其中'b'是'f'的返回类型。 – bheklilr
非常感谢!这是一个很好的解释!欣赏它。 –
请您告诉我为什么这个'c b a = a b'的类型是'c :: t1 - >(t1 - > t) - > t'? @bheklilr –