作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个参数化类型,我想将其限制为数字类型,更具体地说是 Fractional
,例如:
data Rating a = (Fractional a) => Score a | Unscored deriving (Show, Eq)
以便 API 的用户可以定义他们可能使用的非整数类型(Float
或 Double
?),但我编写的内部 API 代码仍然可以对数字类型执行算术运算。我不希望它是一个整数,因为我的“内部操作”的结果可能不是整数,而且我的理解是使用 Fractional
会导致更准确的结果。
编译以上内容(至少在 GHCI 中)会出现以下错误:
Data constructor `Score' has existential type variables, a context, or a specialised result type
Score :: forall a. Fractional a => a -> Rating a
(Use ExistentialQuantification or GADTs to allow this)
In the definition of data constructor `Score'
In the data declaration for `Rating'
这表明我正在做一些我可能不想继续尝试的事情;即我的设计是垃圾。
我想我想在这个 API 中说以下内容:“当您使用 Rating 类型时,它的参数必须是 Fractional
的子类,这样我才能对其执行准确的算术运算”。我怎样才能做到这一点?还是我偏离了目标和/或过度设计?
最佳答案
您不应该将 Fractional
约束放在数据类型上,而应该放在使用它的函数上。所以
data Rating a = Score a | Unscored deriving (Show, Eq)
makeSomeRating :: Fractional a => a -> Rating a
makeSomeRating x = Score (x / 2) -- can use Fractional functions here
doSomethingElseWithRating :: Fractional a => Rating a -> Something
关于haskell - 我可以在 Haskell 中的类型/数据构造函数上约束参数多态类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35575847/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!