Как получить строковое значение элемента?
Я хочу сделать что-то вроде этого:
getValue :: Element -> String
getValue x = do
v <- get UI.value x
v
Однако выдается ошибка; ожидаемый тип get UI.value x
является [String]
но фактический тип UI String
?
Но если я изменю сигнатуру типа на getValue :: Element -> UI String
, мой последний v
получает ошибку ожидаемого типа UI String
в то время как его фактический тип String
,
Я пытаюсь реализовать что-то вроде этого:
myfunction window = do
words <- getElementsByClassName window "word"
let strs = map getValue words
Так как я не могу сказать let strs = map (\x -> v <- get UI.value x) words
,
Когда у меня есть только один элемент для работы, я в порядке:
filename <- chooser # get UI.value
liftIO $ print filename
unless (null filename) $ do
prevRows <- getElementsByClassName w "row"
mapM_ delete prevRows
elems <- liftIO $ readJSON filename
mapM_ (element table # addRow) elems
1 ответ
Поскольку get UI.value x
имеет тип UI String
в отличие от String
правильное определение getValue
должен быть в UI
а монада:
-- Still not well-typed
getValue :: Element -> UI String
getValue x = do
v <- get UI.value x
v
Однако ваша следующая проблема заключается в том, что после get UI.value x
в v
, v
имеет тип String
не UI String
так что вам нужно return
это, приводя к правильной версии
getValue :: Element -> UI String
getValue x = do
v <- get UI.value x
return v
что, конечно, можно упростить как
getValue :: Element -> UI String
getValue x = get UI.value x
или η-уменьшенный далее до
getValue :: Element -> UI String
getValue = get UI.value
поскольку UI
монада, вы можете использовать стандартные комбинаторы монады, такие как mapM
превратить getValue :: Element -> UI String
в mapM getValue :: [Element] -> UI [String]
:
myfunction window = do
words <- getElementsByClassName window "word"
strs <- mapM (get UI.value) words
-- ... rest of `myfunction` can use `strs`
Обратите внимание, что myfunction
конечно все еще в UI
,