Где с лямбда в хаскеле - PullRequest
       50

Где с лямбда в хаскеле

0 голосов
/ 02 марта 2019

Я читаю 2-е издание (великой) книги Грэма Хаттона "Progamming in Haskell" (Cambridge Press).

Читая раздел «Государственная монада», я наткнулся на небольшое задание, которое я дал себе.

Как можно переписать следующее, используя where вместо let?

type State = Int
newtype ST a = S (State -> (a, State))

instance Functor ST where
    -- fmap :: (a -> b) -> ST a  -> ST b
    fmap g st = S (\state -> let (x, s') = app st state in (g x, s'))

Я пробовал варианты этого кода, но он не работает:

instance Functor ST where
   -- fmap :: (a -> b) -> ST a  -> ST b
   fmap g st = S (\state -> (g x, newstate))
              where (x, newstate) = app st state

Я знаю, что он сам по себе бесполезен, но я хотел бы знать, возможно ли это и как это возможно.

1 Ответ

0 голосов
/ 02 марта 2019

let BINDINGS in EXPRESSION является выражением и может использоваться везде, где разрешено выражение.

where только присоединяется к объявлениям, но не к выражениям.\state -> ... не является декларацией, поэтому вы не можете прикрепить where к нему.Вы также не можете присоединить его к внешнему объявлению, потому что тогда state не будет находиться в области видимости.

Возможное решение:

instance Functor ST where
    fmap g st = S f
        where
        f state = (g x, s')
            where (x, s') = app st state

Вместо анонимной функции \state -> ... мыесть локальное объявление f state = ..., к которому мы можем прикрепить предложение where, которое имеет доступ к state.

...