gpt4 book ai didi

haskell - 我可以在 Haskell 中的类型/数据构造函数上约束参数多态类型吗?

转载 作者:行者123 更新时间:2023-12-05 09:20:51 25 4
gpt4 key购买 nike

我有一个参数化类型,我想将其限制为数字类型,更具体地说是 Fractional,例如:

data Rating a = (Fractional a) => Score a | Unscored deriving (Show, Eq)

以便 API 的用户可以定义他们可能使用的非整数类型(FloatDouble?),但我编写的内部 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com