Как получить строковое значение элемента?

Я хочу сделать что-то вроде этого:

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,

Другие вопросы по тегам