我讀哈斯克爾書和好奇,爲什麼綁定運營商的返回類型看起來很奇怪我綁定語法分析器返回錯誤類型
對於給定的定義
type Parser a = String -> [(a, String)]
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
bind :: Parser a -> (a -> Parser b) -> Parser b
p `bind` f = \inp -> concat [ f x inp' | (x, inp') <- p inp]
,當我在GHCI定義將z作爲
let z = item `bind` (\x -> (\y -> result (x,y))) "Rohit"
返回類型爲
>> :t z
z :: Parser ([Char], Char)
問題: (1)不應該返回類型(Char,[Char])? 「(x,inp')< -p inp」should yield - >「('r',」ohit「)」。下一個fx inp'是左聯合的,因此fx應該產生字符'r'並傳遞給應該返回結果元組('r',「ohit」)的lambda表達式,但爲什麼z類型是([Char],char )::(X,Y)
(2)如何打印z的值在上述情況下的ghci的
非常感謝,我會記住這個☺ –
我嘗試了建議,但得到了下面的異常* Main> let z = item'bind' (\ x - >(\ y - > result(x,y)))$「Rohit」:89:35: 無法與'[(b0,String)]'' 期望的類型:[(b0,String)]匹配類型'String - > [((Char,String),String)]' 實際類型:Parser(Char,String) 在'result'調用的返回類型中 可能的原因:'result'應用於太少參數 在表達式中:result(x,y) 在表達式:(\ y - > result(x,y)) –
'result'的類型是什麼?它沒有在你的代碼片段中定義。 – gallais