次のようなばかげたものがあるとします。
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 内のすべての SomeTypes を調べ、すべての単項データ コンストラクターの Int を合計します。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 が計算できないことです。