我已经问了< a href=> “https://stackoverflow.com/ questions/10738806/a-show-instance-for-unflemed” 有关未定义 的问题。由于无法做到这一点,我将描述这个情况,如果这有用的话。 但我认为这个问题很常见,在其他情况下也可以有用。
让我们想象一个情形, 当我们为某语法写一个解析器时。 我们定义了由许多数据类型执行的 AST, 每一个数据类型都有一组构建器, 每个构建器都有一组参数。 每个类型都来自 Show 。 然后我们开始写入解析器的实现, 我们用循环依赖来定义许多函数 。
由于我们有许多功能, 它很难在不检查的情况下同时写入整个模块 。 但函数循环引用将无法编集未完成模块 。 在这种情况下, 我定义钩子功能, 这些功能不会指望返回所需的类型的值 。
这是一个问题! 函数必须返回不是简单的类型, 而是在构造器中带有构造器的数据构建器 。 这对钩子功能来说太难了 。 因此我这样做:
parseHook _ = undefined
在结果数据树上没有“未定义”之前,一切都很简单。我想指出,这种情况发生在发展阶段,我唯一想要的是看到树的结构。当然,我可以把每一种类型都用“也许”来包起来,但我不想改变已经存在的类型。
英语不是我的母语,所以我不确定我是否正确地表达了我的想法。 这就是为什么我要补充一个例子说明这种情况:
data StructParam = StructParam Int Int
deriving Show
data Struct1 = Struct1 Int Int StructParam Int Int Int Int StructParam
deriving Show
data Struct2 = Struct2 Int Int StructParam Int Int Int Int StructParam
deriving Show
data Struct3 = Struct3_var1 Struct1
| Struct3_var2 Struct2
deriving Show
-- this hook is ok, but too long
parse1 _ = Struct1 1 2 (StructParam 3 4) 5 6 7 8 (StructParam 9 0)
-- this hook is short, but undefined
parse2 _ = undefined
-- complete function
rootParse 1 = Struct3_var1(parse1 1)
rootParse 2 = Struct3_var2(parse2 2)
>print $ rootParse 1
Struct3_var1 (Struct1 1 2 (StructParam 3 4) 5 6 7 8 (StructParam 9 0))
>print $ rootParse 2
Prelude.undefined
-- but I want something like this
>print $ rootParse 2
Struct3_var2("undefined")