【发布时间】:2020-02-01 11:17:29
【问题描述】:
我有一个函数foo = \f x -> let c = \y -> x in f c,我已经推断出要找到它:
\forall a,b,r. ((b -> a) -> r) -> a -> r。
GHCI 确认此类型:foo :: ((p1 -> p2) -> t) -> p2 -> t
但是,我无法找到满足这些参数的适用函数,以便 foo 进行评估。
我尝试了以下功能,但没有成功:
bu :: Num a => ([Char] -> a) -> a
bu x = (x "hello") * 2
ba :: (Fractional a1, Foldable t) => t a2 -> a1
ba x = (fromIntegral (length x) ) / 2
另一个尝试是选择以下函数:
bu :: Num a => ([Char] -> a) -> a -> a
bu x = (+ ((x "hello") * 2))
ba :: (Fractional a1, Foldable t) => t a2 -> a1
ba x = (fromIntegral (length x) ) / 2
现在我可以拨打(bu ba) 4并获得正确的结果。
我明白为什么这些不起作用。
问题似乎是在第一个参数(p1 -> p2) -> t) 中,t 需要是一个接受参数p2 的函数。但是,一旦我们这样做,该函数的类型就会更改为 (a -> a) 之类的东西,并且 foo 不能再正确地使用它。
这个练习让我想到了这个问题;具有正确类型的功能可以不适用吗? 我的直觉使我相信这是错误的,并且任何具有有效类型的函数都存在适用的输入。有证据吗?
【问题讨论】: