gpt4 book ai didi

haskell - 如何仅为 Floating 创建一个实例?

转载 作者:行者123 更新时间:2023-12-02 06:51:34 25 4
gpt4 key购买 nike

有一个类,我想为其定义一个实例。它看起来像这样:

data MyValue a = MyValue a

class TestClass a where
funcOne:: (Real b) => a b -> a b
funcTwo:: (Real b) => a b -> a b -> a b


instance TestClass MyValue where
funcOne (MyValue x) = MyValue (x*pi)
funcTwo (MyValue x) (MyValue y) = MyValue (x*y)

我收到以下错误:

Could not deduce (Floating b) arising from a use of `pi'
from the context: Real b

我明白错误,但我不知道该如何解决。

我无法将 (Real b) 更改为 (Floating b) 因为其他实例也应该使用 Integral 类型。但是 MyValue 只对 Floating 有意义。是否可以告诉编译器,instance TestClass MyValue 仅适用于Floating

如果不是,那么如何将结果 x*pi 转换回与 x 参数相同的 Real ?如果类型是 Integral,发生什么并不重要,因为 MyValue 在这种情况下没有意义

最佳答案

您可以实现此目的,但您需要修改该数据类型或类。

  • 如果 MyValue 仅对 Floating 有意义,那么将该约束放入其构造函数中可能有意义。

    {-# LANGUAGE GADTs #-}

    data MyValue :: * -> * where
    MyValue :: Floating a => a -> MyValue a

    这保证任何接受 MyValue a 的函数 a 实际上是一个 Floating 实例,因此

      funcOne (MyValue x) = MyValue $ x*pi

    然后会工作。

  • 如果这是一个常见的主题,需要对包含的类型有特定的约束,那么您可以让约束依赖于实例,而不是总是需要 Real:

    {-# LANGUAGE TypeFamilies, ConstraintKinds #-}
    import GHC.Exts (Constraint)

    class TestClass a where
    type Testable a b :: Constraint
    type Testable a b = Real b -- default constraint
    funcOne:: Testable b => a b -> a b
    funcTwo:: Testable b => a b -> a b -> a b

    instance TestClass MyValue where
    type Testable MyValue b = Floating b
    funcOne (MyValue x) = MyValue $ x*pi
    ...
  • 但是让 TestClass 首先处理参数化 (* -> *) 类型也许不是正确的决定,如果您随后需要再次人为地约束参数化。为什么不简单地做

    class TestClass q where
    funcOne :: q -> q
    funcTwo :: q -> q -> q

    instance Floating a => TestClass (MyValue a) where
    funcOne (MyValue x) = MyValue $ x*pi
    funcTwo (MyValue x) (MyValue y) = MyValue $ x*y

    无论如何,这对我来说似乎更干净。如果某些方法确实需要访问包含的类型,也可以使用这种方法,使用关联的类型族:

    class TestClass q where
    type ToTest q :: *
    ...

    instance Floating a => TestClass (MyValue a) where
    type ToTest (MyValue a) = a
    ...

关于haskell - 如何仅为 Floating 创建一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43022461/

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