gpt4 book ai didi

typeclass - 类型同义词对类型类的实例有什么影响? GHC 中的 TypeSynonymInstances 杂注有什么作用?

转载 作者:行者123 更新时间:2023-12-03 13:45:53 26 4
gpt4 key购买 nike

我正在阅读 Real World Haskell Pg 151,我已经盯着以下段落看了一个多小时:

Recall that String is a synonym for [Char], which in turn is the type [a] where Char is substituted for the type parameter a. According to Haskell 98's rules, we are not allowed to supply a type in place of a type parameter when we write an instance. In other words, it would be legal for us to write an instance for [a], but not for [Char]. 16 comments 5335



它根本没有下沉。盯着 the (free not pirated) copy of RWH chapter 6我看到很多其他人真的很痛苦。看评论还是没看懂。。。

首先,这一切都让我感到困惑,所以如果你觉得你可以解释这段经文的任何内容,请或 TypeSynonymInstances请做。

这是我的问题:
  • Int是一个数据构造函数
  • String是数据构造器 AND 类型同义词

  • 现在我无法回答这些问题:
  • 为什么类型同义词会阻止使类型成为类型类的成员(我正在寻找可能与类型同义词的编译或实现有关的某种原因)?
  • 为什么语言的设计者不想要这种语法(我要求推理而不是广泛的理论或 unicode 数学符号)。
  • 我看到这一行“用 Char 代替类型参数 a 的类型 [a]”,我想知道为什么不能用它代替“用 Int 代替类型参数 a 的类型 a”。

  • 谢谢!

    最佳答案

    我认为问题的一部分是两个基本上不相关的限制在起作用:

  • 没有类型同义词实例意味着实例只能是用 data 声明的事物。或 newtype ,而不是 type .这禁止 String ,但不是 [Char] .
  • 没有灵活的实例意味着实例只能提及一种不是变量的类型,并且只有该类型可以用作类型构造函数。这禁止 Maybe Intf Int ,但不是 Maybe a .

  • 以下是 GHCi 所说的 Int , Char , 和 String :
    data Char = GHC.Types.C# GHC.Prim.Char#
    data Int = GHC.Types.I# GHC.Prim.Int#
    type String = [Char]
    IntChar都是没有类型变量参数的简单类型;不涉及类型构造函数,因此您可以非常自由地使用它们创建实例。

    然而,字符串在这两个方面都失败了。是类型同义词,是不允许的,也是应用于非变量的类型构造函数,即应用于Char的列表类型构造函数。

    为了比较,请注意 [a] , Maybe a , 和 Either a b在实例中都有效,但 [Int] , Maybe [a] , 和 Either String a被禁止;希望你现在能明白为什么了。

    至于您的直接问题,我不知道以这种方式设计语言的最初动机是什么,我也没有资格就“最佳实践”发表权威性声明,但对于我自己的个人编码,我没有使用这些编译指示真的很犹豫:
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    {-# LANGUAGE EmptyDataDecls #-}
    {-# LANGUAGE TypeSynonymInstances #-}
    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE FlexibleContexts #-}

    你可以去看看 packages that use pragmas .看起来,灵活的实例确实得到了相当多的使用,并且来自“受人尊敬的”包(例如,Parsec 的源代码中有几个命中)。

    关于typeclass - 类型同义词对类型类的实例有什么影响? GHC 中的 TypeSynonymInstances 杂注有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2125674/

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