2016-04-06 4 views
0

Вот пример из учебника Haskell:Haskell, получая значение от привязок

type Bindings = Map.Map String Int 

isCountCorrect :: Bindings -> Bool 
isCountCorrect bindings = runReader calc_isCountCorrect bindings 

calc_isCountCorrect :: Reader Bindings Bool 
calc_isCountCorrect = do 
    count <- asks (lookupVar "count") 
    bindings <- ask 
    return (count == (Map.size bindings)) 

lookupVar :: String -> Bindings -> Int 
lookupVar name bindings = fromJust (Map.lookup name bindings) 

sampleBindings = Map.fromList [("count", 4), ("1", 1), ("b", 2)] 

main = do 
    putStr $ "Count is correct for bindings " ++ (show sampleBindings) ++ ": " 
    putStrLn $ show (isCountCorrect sampleBindings) 

Я создал функцию, чтобы получить значение «2». Я не знаю, как сделать его общим для произвольной String. Не могли бы вы помочь мне ?

get_valueM :: Reader Bindings Int 
get_valueM = asks (lookupVar "b") >>= (\value -> ask >>= (\_ -> return value)) 

get_value :: Bindings -> Int 
get_value bindings = runReader get_valueM bindings 

ответ

0

Я не уверен, что полностью понял вопрос. Почему бы вам не добавить параметр для "b"?

get_valueM :: String -> Reader Bindings Int 
get_valueM x = asks (lookupVar "b") >>= (\value -> ask >>= (\_ -> return value)) 

Кстати, что последний ask для? Вы не используете его результат, и он не имеет побочных эффектов, поэтому он выглядит так, как его можно удалить.

get_valueM :: String -> Reader Bindings Int 
get_valueM x = asks (lookupVar "b") >>= (\value -> return value) 

, который может быть упрощено до

get_valueM :: String -> Reader Bindings Int 
get_valueM x = asks (lookupVar "b") >>= return 

, который может быть упрощено до

get_valueM :: String -> Reader Bindings Int 
get_valueM x = asks (lookupVar "b") 

Наконец, позвольте мне добавить, что я считаю эти частичные функции опасны. lookupVar не должен вылетать, если привязка не найдена. Тем не менее, они могут быть удобны при игре.

+0

Кроме того, я использовал запрос, потому что >> = передает среду на две подвычисления. Поэтому я не могу заставить эту функцию получить этот аргумент (enviroment) –

Смежные вопросы