1

模式同义词提供了一种表达值的简写方式;他们还可以提供一个抽象名称以避免客户端模块破坏数据声明。这是一个不太有用的例子,作为讨论的例子:

data MyNum = MkNum Int

pattern Zero :: MyNum
pattern Zero = MkNum 0

我可以做的是帮助数据捕获提供Read一个MyNum. 如何获取Read实例Zero?(Zero是一个伪数据构造函数,而不是类型构造函数,所以这个问题是一个类别错误。)

deriving (Read, ...)我能想到的就是避免MyNum手工制作

instance Read MyNum where
  ... parse "MkNum ..."
  ... parse "Zero"

对于解析,Zero应该只是MyNum. 它可以推导出来——或者可以吗?

我认为任何先进的派生机制在这里都没有帮助。因为类型是MyNum唯一关联的构造函数,即MkNum.

我可以提供一个功能readZero :: String -> MyNum。但我不能重载read,因此我不能嵌入Zero我正在阅读的长字符串文字中以制作数据结构。

有任何想法吗?

4

0 回答 0