以下代码 unsurprisingly 抛出了运行时异常:
data Necklace = InvalidNecklace |
Necklace { necklace_id :: Int, meow :: Int, ... }
necklace_id InvalidNecklace
当应用于 InvalidNecklace
时,是否有自然的方法来定义 necklace_id
的值,使其取代抛出异常?
如果我尝试显而易见的事情,GHC 会报多重声明错误:
necklace_id InvalidNecklace = -1
是否有一些编译指示让GHC将其推断的声明替换为此声明?
我可以通过添加{ necklace_id :: Int }
将InvalidNecklace
声明为记录,但据我所知,我无法保证它始终返回-1,并且通常会变得混乱不堪。我可以简单地定义:
get_necklace_id InvalidNecklace = -1
get_necklace_id x = necklace_id x
但这在一定程度上违背了记录的目的。
我想可以通过编写以下代码来创建一个特殊的
invalidNecklace
值:invalidNecklace = Necklace { necklace_id = -1,
meow = error "meow invalidNecklace accessed", ... }
这种第二种方法有什么缺点吗?我肯定会失去使meow
变得严格或未打包的能力,但也许可以维护单独的调试和优化版本。是否有一个局部禁用部分初始化记录警告的编译指示符?