簡體   English   中英

Haskell Monad返回類型

[英]Haskell monad return type

我試圖做一些編程工作,但我無法進入單子程序。 我對IO功能做了一些改進,但是現在我肯定迷路了...

我有一個從網絡加載的XML字符串(因此它被“存儲”在IO String )。 因此,我需要將do塊加載到通用String中。

foo :: IO String -> Nothing
foo xmlio = do
    xmlio <- xml
    -- do some magic

我已經實現了另一個函數,該函數采用純字符串並返回純XML元素。 它的作用還更多,但讓我們簡化一下,因為它對這個問題並不重要。

import Text.XML.Light
import Text.XML.Light.Input

toxml :: String -> Maybe Element
toxml s = parseXMLDoc s

現在,我嘗試將兩者結合起來以接受IO字符串並返回“ IO元素”。

toxmlio :: IO String -> ??? Maybe Element
toxmlio s = do
    pures <- s
    let toReturn = parseXMLDoc s
    return s

返回函數的類型是(根據ghci):

let foo = "<foo>bar</foo>"
:t return (parseXMLDoc foo)
    >> return (parseXMLDoc foo) :: Monad m => m (Maybe Element)

但是如果我將函數的標題更改為

toxmlio :: IO String -> Monad (Maybe Element)
toxmlio s = do
    pures <- s
    let toReturn = parseXMLDoc s
    return s

我收到編譯錯誤

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)

有誰知道如何解決這個問題? 還是我完全迷失了,haskell會用另一種方式嗎? 謝謝您的回答。

看起來像您想要的:

toxmlio :: IO String -> IO (Maybe Element)
toxmlio s = do
    pures <- s
    let toReturn = parseXMLDoc pures
    return toReturn

但是,您可以使用liftM

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

您可以使它更加通用,因為liftM不依賴於特定的monad類型:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM