gpt4 book ai didi

haskell - 使用类型族避免 MPTC 中的显式类型类参数

转载 作者:行者123 更新时间:2023-12-05 01:04:15 24 4
gpt4 key购买 nike

我想知道是否有任何方法(也许是类型族)定义 Buildablebuild 键入类方法,这样的事情会起作用:

>>> import qualified Data.ByteString.Builder as B (Builder)
>>> import qualified Data.Text.Lazy.Builder as T (Builder)

>>> -- This should internally use `int8` from `Data.ByteString.Builder`:
>>> build (8::Int8) :: B.Builder

>>> -- This should internally use `decimal` from `Data.Text.Lazy.Builder`:
>>> build (8::Int8) :: T.Builder

>>> -- If no concrete type is specified, I'd expect something like this:
>>> :t build (8::Int8)
GBuilder Int8

我知道如何让它与 MPTC 一起工作,但是我必须明确定义要构建的值的类型和构建器的类型。有没有办法让类型系统自动选择预期的类型而不显式传递它?

最佳答案

那么,明显的解决方案如下:

class Builder b where
type Element b
build :: Element b -> b

instance Builder B.Builder where
type Element B.Builder = Int8
build = B.int8

instance Builder T.Builder where
type Element T.Builder = Int8
build = T.decimal

然而,问题在于不能使用类型系列来确定实例。所以在这种情况下,实例只能由 b 决定来自 build :: Element b -> b ,但不是通过 Element b .在处理类型检查器错误时,了解这一点很有用。

由于我刚才提到的在很多情况下只能使用数据系列。标准方法是提供一个新型包装器。例如。:
class Builder b where
data Element b
build :: Element b -> b

instance Builder B.Builder where
newtype Element B.Builder = BElement Int8
build (BElement a) = B.int8 a

在这种情况下,可以从 b 中确定实例。和 Element bbuild :: Element b -> b .

关于haskell - 使用类型族避免 MPTC 中的显式类型类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23475371/

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