2012-11-09 37 views
1

解析錯誤是目前我最喜歡的類型哈斯克爾錯誤的。所以我寫一個函數在那裏我得到對的列表,其中第二部分包含一些變量(這是由我以前在我的代碼vars :: a -> [String]定義vars確定。如果列表爲空,則沒有任何自由變量和替代被視爲解決。檢查可用變量

我已經這樣做了,但我發現一個parse error on '|'

solved :: Subst a -> Bool 
solved xs = null [(S(xs,d) | (S(xs,d)) <- xs, not (null (vars d)))] 

我先前定義我的數據類型爲

data Subst a = S [(String,a)] 

我鄙視分析錯誤因爲它需要永遠弄清楚什麼是錯的(哈哈)。任何人的想法?

回答

1

solved xs = null [(S(xs,d) | (S(xs,d)) <- xs, not (null (vars d)))] 
         ^^ 

有一個右括號丟失。

但是,它看起來好像你有進一步的問題,

data Subst a = S [(String,a)] 

solved :: Subst a -> Bool 
solved xs = null [(S(xs,d) | (S(xs,d)) <- xs, not (null (vars d)))] 

xs不在pattern <- xs列表,但一個Subst a。此外,您正在隱藏名稱xs,這使代碼難以遵循。你可能想是這樣

solved (S xs) = null [() | (varname, d) <- xs, not (null $ vars d) ] 
+0

是的這是小事情。謝謝! – Bobo

+0

現在我得到的是沒有實例在'not(null $ vars d)' – Bobo

+0

中使用變量引起的,那麼'vars'函數的功能是什麼?我從你的代碼中拿出了'null(vars d)'。也許你需要在'solved'背景下,沿着'解決:: SomeClass的一個=> SUBST一個的線 - > Bool'。 –

1

你得到了解析錯誤,因爲|是一對括號中 - 它需要直接在列表理解的方括號在語法上是有效的。

固定在此之後,你會因爲你的類型的簽名說,你的函數需要一個Subst a得到一個類型的錯誤,但你治療你的論點就像一個列表。

我也懷疑你會碰到你的vars函數的問題,因爲它不能真的有一個a -> [String]類型的明智函數(其中「明智的」我是指一個不會返回相同的列表每個參數的字符串)。

+0

你是對的,我遇到了類型錯誤 – Bobo