haskell - Haskell中只有一个参数的(==)是什么类型
问题描述
我得到了以下函数,我必须给出最一般的类型。
\x y -> (==)(map x y)
我的方法在附图上。解决方案不同,它是
Eq b=> (a->b)->[a]->[b]->Bool
我不明白 [b] 来自哪里。
更新:我发现类型
\x y z -> (==)(map x y) z
和我原来函数的类型一样。所以基本上你可以在 lambda 函数中删除一个参数,但它仍然存在,因为我们知道 (==) 需要 2 个参数?但为什么?
解决方案
简短的回答:它源于两个操作数(==)
应该具有相同类型的事实。
让我们推导出 的类型\x y -> (==) (map x y)
。我们可以查找(==) :: Eq c => c -> c -> Bool
和的类型map :: (a -> b) -> [a] -> [b]
。
由于我们将x :: d
和y :: e
应用于map
,因此这意味着:
map :: (a -> b) -> [a] -> [b]
x :: d
y :: e
-----------------------------
d ~ a -> b, e ~ [a]
x
有 type ,a -> b
也y
有 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]相反。
推荐阅读
- python - 使用 python 发送电子邮件
- machine-learning - 如何计算随机分类器的准确度得分?
- php - laravel 或 php 问题:点击按钮在同一页面显示值
- python - 在具有 tensorflow 后端的 keras 中重用内核权重
- java - 无法上传包含在火狐浏览器上
- android - 蓝牙打印机打印 QR Image android studio
- javascript - 在 Reactjs 中创建一个可折叠的 ul li
- python - 如何从新文件开始新的 while 循环——Python 3(使用 Pygame)
- ubuntu - TCP 窗口大小卡住了
- jquery - 更改 HTML 中 jQuery 数据表的背景颜色