/ / Jak przekazywać argumenty za pomocą oceny rekurencyjnej (drzewa) w Haskell - haskell, rekurencja

Jak przekazywać argumenty przez rekursywną (drzewną) ocenę w Haskell - haskell, rekursja

Piszę funkcję, która wymaga kompozytuinterakcja i rekurencyjnie ją odtwarza, patrząc na prymitywne wartości. Jest to w zasadzie rodzaj drzewa (myślę). Jednak musi śledzić 2 ostatnie prymitywne wartości, które sprawdził podczas wykonywania tej czynności. W niefunkcjonalnym języku mógłbym po prostu użyć zmiennych globalnych, ale nie jestem pewien, jak sobie z tym poradzić w Haskell.

Być może mógłbym przekazać listę eksperymentów ispraw, aby powrócił (Inter, Experiment), a następnie dodaj to w miejscu oznaczonym poniżej? I żeby nie zadzierać (Composite pre (enact post)), dostałbym połączenie na poprzedniej linii i użyłem tylko wartości Inter. ... Świetnie, wpisując to, mogłem znaleźć coś skomplikowanego. Byłbym jednak wdzięczny za wskazówki, jeśli istnieje bardziej elegancki sposób radzenia sobie z tym.

data Inter = None | Primitive Experiment Result | Composite Inter Inter deriving (Show, Read, Eq, Ord)

enact :: Inter -> Inter
enact (Composite pre post) =
let enacted = enact pre
-- add to eHist here, pass it on. Reconstruct it after you finish?
in if enacted /= pre
then enacted
else (Composite pre (enact post))
enact (Primitive e _) = (Primitive e (getResult10 e))
enact None = None

-- Environment040
getResult40 :: [Experiment] -> Experiment -> Result
getResult40 (pre:pen:_) cur
| pen /= cur && pre == cur = R2
| otherwise = R1

Odpowiedzi:

0 dla odpowiedzi № 1

Nie widzę reszty kodu, więc nie mogę skomponować reszty. Oto pomysł, w jaki sposób można przekazać „stan globalny” jako enact oblicza gałęzie drzewa:

data Inter e r = None | Primitive e r
| Composite (Inter e r) (Inter e r)
deriving (Show, Read, Eq, Ord)
enact :: (Eq e, Eq r) => Inter e r -> State a (Inter e r)
enact (Composite pre post) = do
enacted <- enact pre
x <- get -- and then you can use x, if enact depends on the last
-- two Primitives seen
if enacted /= pre
then return enacted
else do
post" <- enact post
return $ Composite pre post"
enact (Primitive e r) = do
x <- get
put $ modify x somehow -- you wanted to keep track of
-- the last two Primitives
return $ Primitive e r
enact None = return None

Musiałem zastąpić typy e i r tylko po to, aby się upewnić, że się skompiluje; i, szczerze mówiąc, nie tęsknię. Teraz możesz użyć get i put zapytać o stan (typu a tutaj, ale możesz być bardziej szczegółowy - np. krotek wcześniejszych pierwotnych wartości, o których myślałeś) i zestaw do użycia przez ocenę dalej w dół drzewa. Następnie możesz użyć runState lub evalState aby podać stan początkowy (np. początkową krotkę reprezentującą nie znaleziono jeszcze wartości pierwotnych) i odzyskać albo drzewo Interslub drzewo i stan końcowy.