小编Wil*_*man的帖子

如何表达 Haskell 中“()”是所有其他(非“Void”)类型的子集这一事实?

我最近开始学习 Haskell,我编写了以下代码作为小型解析库的一部分:

-- Successful iff the input string has a length of zero
parseEOF :: Parser ()
parseEOF = Parser p
  where
    p [] = Just ((), "")
    p _ = Nothing
Run Code Online (Sandbox Code Playgroud)

该代码将受益于多态性,因为()它只是表明输出中没有表达任何信息,这对于任何非类型都是可能的Void,例如对于整数,这个“无相对信息”元素可以用 0 标识。

解决此问题的一个简单方法是创建以下类型类:

class NonVoid n where
  nil :: n
Run Code Online (Sandbox Code Playgroud)

上面的代码重新呈现为

parseEOF :: NonVoid n => Parser n
parseEOF = Parser p
  where
    p [] = Just (nil, "")
    p _ = Nothing
Run Code Online (Sandbox Code Playgroud)

类型类方法的问题是对所有类型实现起来可能很麻烦。()是否有另一种方法来表达Haskell 中所有其他类型的“子集”的概念?我不只是要求提供上面的代码(我的问题可以通过其他方式解决),但这似乎是一个非常重要的想法。这个想法可以进一步推广到 2 型和任何 n 型。

haskell types typeclass unit-type

3
推荐指数
1
解决办法
134
查看次数

标签 统计

haskell ×1

typeclass ×1

types ×1

unit-type ×1