gpt4 book ai didi

haskell - 类型类定义中的抽象数据类型

转载 作者:行者123 更新时间:2023-12-01 08:49:19 24 4
gpt4 key购买 nike

我正在尝试了解以下类型 s 发生了什么:

class A a where
f :: a -> s

data X = X

instance A X where
f x = "anything"

我预计这会起作用,因为类型 s 没有绑定(bind)到任何东西,它可以是任何东西。但是编译器说它“无法将预期类型‘s’与实际类型‘[Char]’匹配”,好像 s 类型是固定类型,如 Int、Char……

所以我的第二个解释是,由于我们对类型类声明中的 s 一无所知,所以我们无法判断何时使 X 成为A 如果我们给出的函数 f 的返回值匹配类型 s 与否。但是有些类型类使用抽象数据类型,这些数据类型不会毫无问题地绑定(bind)到任何东西,比如 Functor:

class Functor f where
fmap :: (a -> b) -> f a -> f b

为什么上面的类型 s 有问题,而这里的类型 ab 没有问题?

最佳答案

你试图表达这一点:

    f :: a -> ∃s . s

...但是你写的签名实际上是什么

    f :: a -> ∀s . s

这一切意味着什么?

  • 存在类型 ∃s 。 s 的意思是,函数可能返回一个 某种类型的值,即“存在一个类型 s 使得函数返回一个 s value”。
    Haskell 语言不支持这个,因为它没有用。
  • 通用类型 ∀s . s 的意思是,该函数能够产生一个任何类型的值,即“对于所有类型s,该函数可以返回一个s 值”。

后者非常有用; fmap 实际上是一个很好的例子:该函数有效,无论 ab 是什么类型,并且始终保证用户得到结果实际上将具有所需的类型,即 f b.

但这意味着您不能像使用 String 那样在实现中只选择某些特定类型。 ...嗯,实际上你可以做到这一点,但只能通过将存在包装在数据类型中:

{-# LANGUAGE ExistentialQuantification, UnicodeSyntax #-}

data Anything = ∀ s . Anything s

class A a where
f :: a -> Anything

instance A X where
f x = Anything "anything"

...但正如我所说,这几乎完全没用,因为当有人想要使用该实例时,他们将无法知道包装结果值的特定类型。对于完全未知类型的值,您无能为力。

关于haskell - 类型类定义中的抽象数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713879/

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