Haskell单子返回类型
我想做一点编程,但我不能进入monads。我在IO功能方面有点进步,但现在我肯定迷路了 我有一个从网络加载的XML字符串(因此它“存储”在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元素” 有人知道如何解决这个问题吗?还是我完全迷路了,哈斯克尔用
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