假设我有这样的愚蠢行为:
data SomeType
= Unary Int
| Associative SomeType
| Binary SomeType SomeType
some_func :: SomeType -> Int
some_func s =
case s of
Unary n -> n
Associative s1 -> some_func s1
Binary s1 s2 -> some_func s1 + some_func s2
这里 some_func 将查看给定 SomeType 中的所有 SomeType 并总结所有 Unary 数据构造函数的 Ints。SomeType 是一种递归数据类型。
在这些模式匹配中,我重复了some_func s1
。有没有办法使用@,when,let或其他任何东西来声明sf1 = some_func s1
和使用它?像这样的东西:
data SomeType
= Unary Int
| Associative SomeType
| Binary SomeType SomeType
some_func :: SomeType -> Int
some_func s =
case s of
Unary n -> n
Associative s1 -> sf1
Binary s1 s2 -> sf1 + sf2
where
sf1 = some_func s1
sf2 = some_func s2
这里的问题是 s1 和 s2 只在之后的块中知道,->
而 sf1 无法计算。