我最近开始学习 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 型。