Дано
data BTree a = End
| Node a (BTree a) (BTree a)
deriving(Show,Eq,Ord)
data Msg = Msg { from :: String
, to :: String
, when :: Int
, message :: String }
instance Ord Msg where
compare a b = (when a) `compare` (when b)
instance Eq Msg where
(==) a b = (when a) == (when b)
Моя функция для подсчета узлов (что кажется неправильным, но это не вопрос)
count :: (Ord a) => (BTree a) -> Int
count = sum . count'
where
count' :: (Ord a) => (BTree a) -> [Int]
count' End = []
count' (Node _ l r) =
[1] ++ (count' l) ++ (count' r)
Разве count
не оценивает содержимое Msg
на основании того, что его значение отбрасывается _
? Возможно, лучше спросить, как мне узнать, где начинается и заканчивается ленивая оценка для такого рода вещей?
Если бы третья строка count'
была:
count' (Node (Msg x _ _ _) l r) =
Могу ли я предположить, что другие три поля Msg
были доступны/оценены, или ленивая оценка зашла так далеко?
((Node (Msg x !_ !_ !_) l r)
для принудительной оценки. Включить шаблоны челки с помощью прагмы{-# LANGUAGE BangPatterns #-}
- person fuz   schedule 10.10.2011_
он соответствует чему угодно, поэтому ничего не будет оцениваться. - person is7s   schedule 10.10.2011