Предположим, что я хочу смоделировать древовидную структуру в Haskell с
data Tree = Null | Node Tree Integer Tree deriving Show
, и я хотел бы проверить, если каждая запись, скажем, меньше 10. Я подумал, что буду использовать сопоставление с образцом и запись
isSmall :: Tree -> Bool
isSmall _
| Null = True
| (Node a b c) = if b >= 10
then False
else isSmall a && isSmall c
Однако выдает ошибки о том, что a
, b
и c
находятся вне области видимости.Я бы подумал, что, поместив их в охранники, в основном поместил бы их в прицел.Разве это не то, как вы должны делать сопоставление с образцом в Haskell?Я искал примеры, которые могли бы помочь мне, но я не нашел примеров сопоставления с образцом у охранников, которые используют структуру данных, состоящую из нескольких других структур данных.
Ошибка:
test.hs:24:6: Not in scope: data constructor ‘Node’
test.hs:24:11: Not in scope: ‘a’
test.hs:24:13: Not in scope: ‘b’
test.hs:24:15: Not in scope: ‘c’
test.hs:24:27: Not in scope: ‘b’
test.hs:26:38: Not in scope: ‘a’
test.hs:26:57: Not in scope: ‘c’