我正在閱讀Wiki書中的 "在48小時內寫出自己的方案"
。Haskell庫Parsec被用來決議基本運算式,比如數字(如下圖代碼所示)。
import Lib
import Text.ParserCombinators.Parsec hiding (spaces)
import 系統.環境
import Control.Monad
import Data.Typeable ( typeOf )
import Debug.Trace
data LispVal = Atom String
| List [LispVal]
| DottedList [LispVal] LispVal
| Number IntegerString String String
| Bool Bool
deriving Show
-- .../span>
parseNumber :: Parser LispVal[/span
parseNumber = do
x <- many1 digit
回傳 $ Number (read x)
書中的一個練習要求讀者用parseNumber代替>>=符號重寫。然而,我一直遇到可怕的型別不匹配錯誤。誰能告訴我如何使用>>=符號重寫這個函式?或者至少給我一個提示?
uj5u.com熱心網友回復:
Haskell報告中有一節關于do符號以及如何 "解糖 "這些do塊。
如果你寫一個do塊為:
parseNumber = do
x <- many1 digit
回傳(Number (read x))
那么這在語法上就相當于:
parseNumber :: Parser LispVal[/span
parseNumber = many1 digit >>= x -> return (Number (read x))
或者更優雅:
parseNumber :: Parser LispVal[/span
parseNumber = many1 digit >>= return . Number . read
然而我們不需要用>>=來作業。事實上,如果我們想對將用Parser構建的專案應用一個函式,那么我們可以使用fmap :: Functor f => (a -> b) -> f a -> f b或者 (<$>) :: Functor f => (a -> b) -> f a -> f b為:
parseNumber :: Parser LispVal[/span
parseNumber = Number . read <$> many1 digit
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316977.html
標籤:
上一篇:我怎樣才能多型地解釋一個類似Arrow的GADTDSL?
下一篇:鞍山市的搜索起點
