首页 > 解决方案 > Haskell中只有一个参数的(==)是什么类型

问题描述

我得到了以下函数,我必须给出最一般的类型。

\x y -> (==)(map x y)

我的方法在附图上。解决方案不同,它是

Eq b=> (a->b)->[a]->[b]->Bool

我不明白 [b] 来自哪里。

更新:我发现类型

\x y z -> (==)(map x y) z

和我原来函数的类型一样。所以基本上你可以在 lambda 函数中删除一个参数,但它仍然存在,因为我们知道 (==) 需要 2 个参数?但为什么?

在此处输入图像描述

标签: haskelltypes

解决方案


简短的回答:它源于两个操作数(==)应该具有相同类型的事实。

让我们推导出 的类型\x y -> (==) (map x y)。我们可以查找(==) :: Eq c => c -> c -> Bool和的类型map :: (a -> b) -> [a] -> [b]

由于我们将x :: dy :: e应用于map,因此这意味着:

map :: (a -> b) -> [a] -> [b]
x   ::    d
y   ::              e
-----------------------------
d ~ a -> b, e ~ [a]

x有 type ,a -> by有 type [a]

现在我们知道map x y有 type map x y :: [b]。这是函数应用程序中的参数(==)。因此,我们可以推导出(==) (map x y)as 的类型:

(==)    :: Eq c =>  c -> c -> Bool
map x y ::         [b]
----------------------------------
c ~ [b]

因此,因为c ~ [b],这意味着 的类型(==) (map x y) :: Eq [b] => [b] -> Bool,因此\x y -> (==) (map x y)具有类型\x y -> (==) (map x y) :: Eq [b] => (a -> b) -> [a] -> [b] -> [b]

因为它认为:

instance Eq a => Eq [a]

因此,我们可以将类型约束从 更改Eq [b]为 just Eq b

更新:我发现类型

\x y z -> (==)(map x y) z

因为(==) (map x y)是一个函数,所以上面确实成立,因为这与η-reduction [Haskell-wiki]相反。


推荐阅读