2016-06-15 12 views
-2

Übung 23.8.2 im Haskell Buch fragt mich, einen Zustand wie die folgenden zu konstruieren:Staat, in dem der resultierenden Zustand ist das Argument zur Verfügung gestellt und der Wert Einheit

put' :: s -> State s() 
put' s = undefined 
-- should act like: 
-- Prelude> runState (put "blah") "woot" 
-- ((),"blah") 

Die einzige Implementierung ich bekommen habe zu typecheck ist

import Control.Monad.Trans.State -- Not sure this is the right import 
put' :: s -> State s() 
put' s = state $ \s -> ((), s) 

Aber das gibt den Zustand, in dem Argument von runState, nicht put':

λ> runState (put' "blah") "woot" 
((),"woot") 

Was Hakerk Akrobatik muss ich reparieren? Sieh nicht, wie ich auf die "blah" zugreifen kann.

Antwort

5
put' s = state $ \s -> ((), s) 
    ^  ^

Sie haben die Variable für zwei verschiedene Bindungen wiederverwendet. Versuchen Sie es mit einem anderen Namen, und die Lösung wird offensichtlich sein ;-)

Übrigens sollten Sie Warnungen mit dem Flag -Wall in GHC/GHCi aktivieren. Dies hätte darauf hingewiesen, dass Sie s Twise definiert haben, und die zweite Bindung die erste schattiert.

+0

Ja, ja, Lambda-Äquivalenz (oder einige solcher ...) –