作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这是代码有点傻,但有人可以解释为什么 isList [42]
返回 True
而isList2 [42]
打印 False
,以及如何防止这种情况?我想更好地理解一些更晦涩的 GHC 类型扩展,我认为这将是一个有趣的例子。
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE IncoherentInstances #-}
class IsList a where
isList :: a -> Bool
instance IsList a where
isList x = False
instance IsList [a] where
isList x = True
isList2 = isList
main =
print (isList 42) >>
print (isList2 42) >>
print (isList [42]) >>
print (isList2 [42])
最佳答案
这真的很简单。请问GHCi是什么类型的isList2
是:
∀x. x ⊢ :t isList2
isList2 :: a -> Bool
[a]
不匹配实例(尽管它可以通过统一),但它确实匹配
a
立即实例。因此,GHC 选择
a
例如,所以
isList2
返回
False
.
IncoherentInstances
方法。实际上,这是一个很好的演示。
IncoherentInstances
,我们得到完全相反的效果,GHCi 现在这样说:
∀x. x ⊢ :t isList2
isList2 :: [Integer] -> Bool
isList2
是一个没有使用函数语法定义的顶级绑定(bind),因此受到可怕的单态限制。所以它被专门用于它实际使用的实例。
NoMonomorphismRestriction
以及禁用
IncoherentInstances
,我们得到这个:
∀x. x ⊢ :t isList2
isList2 :: IsList a => a -> Bool
∀x. x ⊢ isList2 'a'
False
∀x. x ⊢ isList2 "a"
True
∀x. x ⊢ isList2 undefined
<interactive>:19:1:
Overlapping instances for IsList a0 arising from a use of `isList2'
isList2
一个类型签名,它可以防止
IncoherentInstances
避免过早选择实例。
isList2 :: (IsList a) => a -> Bool
isList2 = isList
isList
被提及(甚至是间接地)而不被应用于论证。
IncoherentInstances
.
main =
print (isList (42 :: Integer)) >>
print (isList2 (42 :: Integer)) >>
print (isList [42]) >>
print (isList2 [42])
OverlappingInstances
做它的事。
关于Haskell 重叠/不连贯的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16050566/
这是我第一次使用 SO。对不起我的英语,但我会尽力而为,并完整地描述我的大学任务问题,以便您更好地理解。我确定我的问题更多是与代码和数组相关,而不是数学。 我正在使用 MPI、OpenMP 以及大尺寸
我是一名优秀的程序员,十分优秀!