Określaniu zakresu oceny leniwy

głosy
1

Dany

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)

Moja funkcja liczyć węzłów (co wydaje się jednak, że to oprócz kwestii) jest

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)

Czy countnie oceniać zawartość Msgmocy przez jej wartości są odrzucane przez _? Być może lepsze pytanie, skąd mam wiedzieć, gdzie leniwe oceny rozpoczyna się i kończy na tego typu rzeczy?

Jeżeli trzecia linia count'była:

count' (Node (Msg x _ _ _) l r) =

Mogę założyć, że pozostałe trzy obszary Msgbyły dostępne / oceniano, czy też ocena leniwy iść tak daleko?

Utwórz 10/10/2011 o 17:38
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Nie Pola struktury danych są oceniane leniwie domyślnie. Ponieważ nie używasz inne pola w żaden sposób, nie będą oceniane przez ten kod. Jeśli chcesz zrobić to tak, że oceniania siły węzłowe wszystkie jego pola, aby być oceniane, możesz dodawać adnotacje surowości do pól:

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 }

Od licząc węzły zmusza węzły sami zostać ocenione, będzie to również wymusić wartości węzłów do oceny. Jeśli chcesz tylko to zachowanie dla jednej funkcji, można wymusić ocenę w bardziej drobnoziarnistej sposób stosując seq:

count' (Node x l r) = x `seq` ([1] ++ count' l ++ count' r)

lub wzór grupowy (wymaga BangPatternsrozszerzenia)

count' (Node !x l r) = [1] ++ count' l ++ count' r
Odpowiedział 10/10/2011 o 17:56
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more