如何获取Element的字符串值?

How to obtain the string value of an Element?

我想做这样的事情:

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

因为 get UI.value x 的类型是 UI String 而不是 StringgetValue 的正确定义也需要在 UI monad 中:

-- 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

当然can be simplified作为

getValue :: Element -> UI String
getValue x = get UI.value x

或 η-进一步减少到

getValue :: Element -> UI String
getValue = get UI.value

因为 UI 是一个 monad,你可以使用像 mapM 这样的标准 monad 组合器将 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.