- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解haskell中的临时多态性,即具有相同的函数为不同的参数类型提供不同的行为。
但是,虽然下面的测试代码编译
{-# LANGUAGE MultiParamTypeClasses #-}
class MyClass a b where
foo :: a -> b
instance MyClass Bool Int where
foo True = 0
foo False = 1
instance MyClass Double Double where
foo x = -x
foo True
No instance for (MyClass Bool b0) arising from a use of `foo'
The type variable `b0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there is a potential instance available:
instance MyClass Bool Int -- Defined at test.hs:6:10
Possible fix: add an instance declaration for (MyClass Bool b0)
In the expression: foo True
In an equation for `it': it = foo True
foo True :: Int -- gives 0
fooBool
和
fooDouble
)
最佳答案
您面临的问题是重载由类中的所有类型决定——包括仅作为返回类型出现的类型。您可以拥有两个 MyClass Bool Int
的实例和 MyClass Bool String
,并且它将能够根据预期的类型来消除歧义。
Haskell 类型类的核心设计权衡之一是“开放世界假设”。 Haskell 类型实例是隐式全局的:特定类型(或类型序列,在这种情况下)在整个程序中只能有一个实例,该实例隐式导出到使用该类型的所有模块。
这使得在没有意识到的情况下获取某个类的新实例变得非常容易,因此 Haskell 类型检查器假定实例可能存在于任何有效的类型组合中。在您的情况下,这意味着虽然 MyClass Bool Int
是唯一使用 Bool
的实例, 它与其他可能的 MyClass Bool b
仍然模棱两可实例。
一旦为整个表达式的类型添加注释,它就不再模棱两可了,因为 a
和 b
是固定的。
要获得您期望的行为,您可以使用 FunctionalDependencies
.这些允许您指定只有一个可能的 b
对于任何给定的a
,这将使 GHC 正确推断类型。它看起来像这样:
class MyClass a b | a -> b where
MyClass Bool Int
的实例。和
MyClass Bool String
.
关于Haskell 即席多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30039135/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!