Haskell单子返回类型

Haskell单子返回类型,haskell,io,monads,Haskell,Io,Monads,我想做一点编程,但我不能进入monads。我在IO功能方面有点进步,但现在我肯定迷路了 我有一个从网络加载的XML字符串(因此它“存储”在IO字符串中)。因此,我需要一个do块来加载到公共字符串 foo :: IO String -> Nothing foo xmlio = do xmlio <- xml -- do some magic 现在我尝试将这两者结合起来,以接受一个IO字符串并返回一个“IO元素” 有人知道如何解决这个问题吗?还是我完全迷路了,哈斯克尔用

我想做一点编程,但我不能进入monads。我在IO功能方面有点进步,但现在我肯定迷路了

我有一个从网络加载的XML字符串(因此它“存储”在
IO字符串中)。因此,我需要一个
do
块来加载到公共字符串

foo :: IO String -> Nothing
foo xmlio = do
    xmlio <- xml
    -- do some magic
现在我尝试将这两者结合起来,以接受一个IO字符串并返回一个“IO元素”


有人知道如何解决这个问题吗?还是我完全迷路了,哈斯克尔用另一种方式?谢谢您的回答。

看起来您想要:

toxmlio :: IO String -> IO (Maybe Element)
toxmlio s = do
    pures <- s
    let toReturn = parseXMLDoc pures
    return toReturn
您可以使其更为通用,因为
liftM
不依赖于特定的monad类型:

toxmlio :: Monad m => m String -> m (Maybe Element)
toxmlio = liftM parseXMLDoc

看起来您想要:

toxmlio :: IO String -> IO (Maybe Element)
toxmlio s = do
    pures <- s
    let toReturn = parseXMLDoc pures
    return toReturn
您可以使其更为通用,因为
liftM
不依赖于特定的monad类型:

toxmlio :: Monad m => m String -> m (Maybe Element)
toxmlio = liftM parseXMLDoc

在这里,定义一个接受
IO字符串
参数的函数是错误的。
IO字符串
不是用某种东西包装的字符串,而是返回字符串的过程。例如,绑定两次将从网络加载两次。除非编写某种控制结构,否则通常不会编写将
iosomething
作为参数的函数。我认为如果你请求帮助编写你想调用的代码会更好。我只是Haskell的初学者,老实说,我不喜欢它的懒惰。我知道函数式行为。我不想对这个主题说得太具体,基本上我需要从Internet加载一个XML,处理它,然后根据结果加载另一个XML。但是,我确实希望将任务拆分为更多的函数,因此我希望使用IO输入实现这些方法(因为最内部的函数返回IO,我无法摆脱它)。因此,是否最好使用一个
do
来处理输入、包装IO并正常调用其他函数?是的。尽可能保持代码的纯净。它既易于使用和理解,也便于在解释器中测试您的函数。非常感谢您的提示。在这里定义使用
IO字符串
参数的函数是错误的。
IO字符串
不是用某种东西包装的字符串,而是返回字符串的过程。例如,绑定两次将从网络加载两次。除非编写某种控制结构,否则通常不会编写将
iosomething
作为参数的函数。我认为如果你请求帮助编写你想调用的代码会更好。我只是Haskell的初学者,老实说,我不喜欢它的懒惰。我知道函数式行为。我不想对这个主题说得太具体,基本上我需要从Internet加载一个XML,处理它,然后根据结果加载另一个XML。但是,我确实希望将任务拆分为更多的函数,因此我希望使用IO输入实现这些方法(因为最内部的函数返回IO,我无法摆脱它)。因此,是否最好使用一个
do
来处理输入、包装IO并正常调用其他函数?是的。尽可能保持代码的纯净。这不仅便于使用和理解,而且也便于在解释器中测试您的功能。非常感谢您的提示。谢谢您的回答,这个解决方案很有效,但我更愿意遵循hammar的建议。不管怎样,我还是接受这个答案。谢谢你的回答,这个解决方案是可行的,但我宁愿遵循哈马尔的建议。无论如何,我接受这个答案。
Kind mis-match
The first argument of `Monad' should have kind `* -> *',
but `Maybe Element' has kind `*'
In the type signature for `xmlio':
  xmlio :: String -> Monad (Maybe Element)
toxmlio :: IO String -> IO (Maybe Element)
toxmlio s = do
    pures <- s
    let toReturn = parseXMLDoc pures
    return toReturn
toxmlio :: IO String -> IO (Maybe Element)
toxmlio = liftM parseXMLDoc
toxmlio :: Monad m => m String -> m (Maybe Element)
toxmlio = liftM parseXMLDoc