我對haskell完全陌生。我需要一個回傳運算子或以字串形式回傳錯誤訊息的函式。對于背景關系,我正在構建一個接受雙打的 Monadic Parser。
term'::Parser Double
term' = factor' `chainl1` mulop
addop, mulop :: Parser (Double -> Double -> Double)
mulop = do symbol "^"
return (**)
do symbol "*"
return (*)
do symbol "/"
return (/)
addop = do symbol " "
return ( )
do symbol "-"
return (-)
上面的代碼很適合回傳運算子,但是當我嘗試通過添加錯誤訊息來擴展它時,我得到了編譯錯誤。以下是我正在嘗試的內容。
mulop :: Either (Parser (Double -> Double -> Double)) (Parser String)
mulop = do symbol "^"
return Left (**)
do symbol "*"
return Left (*)
do symbol "/"
return Left (/)
pure Right "ERROR MSG"
uj5u.com熱心網友回復:
那只是一個決議器。它需要輸入來決定輸出是運算子還是錯誤字串。所以簽名必須是
mulop :: Parser (Either (Double -> Double -> Double) String)
實際上有一些約定,當Either用作例外添加型別時,錯誤訊息應該在 上Left,所以也許更好
mulop :: Parser (Either String (Double -> Double -> Double))
在實作中:注意正確使用語法規則。return并且pure只是普通的函式,而不是return程序語言中的特殊關鍵字。所以它必須是return $ Left (**)。
還要確保縮進正確。我會這樣對齊:
mulop = do symbol "^"
return $ Right (**)
do symbol "*"
return $ Right (*)
do symbol "/"
return $ Right (/)
pure (Left "ERROR MSG")
或者,不要使用do符號。您在這里真的不需要任何 monadic,您可以使用<$運算子:
mulop = (Right (**) <$ symbol "^")
(Right (*) <$ symbol "*")
(Right (/) <$ symbol "/")
pure (Left "ERROR MSG")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314393.html
上一篇:我怎樣才能只從soup.find而不是find_all中獲取所有href
下一篇:正則運算式驗證日期格式
