2014-10-28 67 views
1

我有以下功能:哈斯克爾 - 非法字面型誤差函數定義

replace :: a -> Int -> [a] -> [a] 
replace elem 0 x:xs = elem : xs 
replace elem i x:xs = x ++ replace elem (i - 1) xs 

而且GHCI告訴我,我的第一個定義有類型的錯誤非法的文字,特別是在文字0 。現在,我知道,如果我試圖替換列表中的任意項目,我不應該使用列表數據結構。這很好,因爲我正計劃在我能夠得到我想要的工作後儘快重構我的程序。至於編譯器的投訴,我不確定爲什麼Haskell認爲我試圖在這裏定義一個類型。任何幫助,將不勝感激。

+0

在模式和'x:'而不是'x ++'中寫入'(x:xs)'而不是'x:xs'。我不知道它爲什麼會抱怨類型文字 - 當我編譯它時,我得到「解析模式中的錯誤:替換」,這是我所期望的。 – user2407038 2014-10-28 06:02:42

+0

@ user2407038你的評論是一個答案,所以應該真正發佈。 – 2014-10-28 11:06:23

回答

3

正如@ user2407038提到有與您的代碼的兩個直接的問題 - 你mising括號並使用(++)而不是(:) - 你能解決這個問題是這樣的:

replace :: a -> Int -> [a] -> [a] 
replace elem 0 (x:xs) = elem : xs 
replace elem i (x:xs) = x : replace elem (i - 1) xs 

但這樣做還是會離開你只是部分定義不匹配空列表的a S(GHC並會告訴你這麼一個警告) - 來解決這個剛剛添加缺少的情況下:

replace :: a -> Int -> [a] -> [a] 
replace _ _ []  = [] 
replace elem 0 (x:xs) = elem : xs 
replace elem i (x:xs) = x : replace elem (i - 1) xs 

終於可以雷莫已經一些未使用的綁定(變量)和重命名elem(已definied的序幕),使GHC更快樂(-Wall):

replace :: a -> Int -> [a] -> [a] 
replace _ _ []  = [] 
replace el 0 (_:xs) = el : xs 
replace el i (x:xs) = x : replace el (i - 1) xs 
0

我通過移除縮進一個空的空間,解決了這個問題。我相信編譯器認爲這段代碼是以前(無關的)表達式的一部分。另外,我接受了一位評論者的建議,並用x :替換了x ++

+0

是的,頂層定義被認爲是在where塊中(由(可選)模塊聲明開始的)並且需要縮進相同的數量。 – 2014-10-28 06:26:43