【问题标题】:Haskell: Instantiating Show for a Algebraic TypeHaskell:为代数类型实例化 Show
【发布时间】:2014-07-05 05:12:38
【问题描述】:

我有数据类型:

data Posn a = Posn Int Int a

我想为其创建一个自定义 Show 实例,将两个 Int 显示为有序对,如下所示:

showPosn :: Show a => Posn a -> String
showPosn (Posn l c x) = show (l,c) ++ (' ' : show x)

我试过了:

instance Show (Show a => Posn a) where
  show = showPosn

但这给了我错误“非法实例声明”。

令人沮丧的是deriving Show 工作得很好。那么,我的问题是:我需要做什么才能获得我的 Show 实例?

【问题讨论】:

  • 在学习的过程中犯这种错误是很自然的;也就是说,从中我可以看出你对这门语言相当陌生。制作一门语言是学习 Haskell 的好方法,我只是建议保持开放的心态,而不是在你了解它之前尝试修复它。
  • @luqui 感谢您冷静、宽容的回答。在深夜编码之后,我提出了这个问题,所以我想我的挫败感正在表现出来。是的——我对 Haskell 有点陌生。我是一个 Lisp 小子,我最近才接触到类型理论。
  • 另外,如果您认为 Haskell 的类型系统或多或少是“残缺的 DTP”,那么在熟悉 Haskell 之后,您可能想尝试 Agda 或 Idris。

标签: haskell types


【解决方案1】:

没关系,只是语法有点不对:

instance (Show a) => Show (Posn a) where
    show = showPosn

顺便说一下,这不是 GADT,而是常规代数数据类型。

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2023-03-29
    • 2017-08-13
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多