如何获取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
而不是 String
,getValue
的正确定义也需要在 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
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
.
我想做这样的事情:
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
而不是 String
,getValue
的正确定义也需要在 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
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
.