2014-07-08 62 views
-3

- 寫返回一個列表中的位置的索引位置計數狀態,哈斯克爾

的功能 - 在列表中的指定元素的元素。例如:

- I:位置4 [1,4,3,7,4,2]

- O:[2,5]

pos element list = func element list 0 
func :: [a] -> [a] -> [Int] -> [a] 
func _ [_] _ = [] 
func element (x:xs) cont | x==element = cont:func element xs cont+1 
         | otherwise = func element xs cont+1 

擲此錯誤:

- Type error in application 
*** Expression  : x == element 
*** Term   : x 
*** Type   : a 
*** Does not match : [a] 
*** Because  : unification would give infinite type 
+0

您的元件變量具有類型'[α]'而x具有類型'A',因此它們不能相比。 – Reite

+0

第一個參數不是數組。 –

+4

這是功課嗎? – augustss

回答

5

好的想想你在這裏需要什麼。

由於@bheklilr說你的類型是錯誤的。 根據您的樣品:

positions 4 [1,4,3,7,4,2] 
>> [2,5] 

我也猜你需要的是這樣的:

positions :: Eq a => a -> [a] -> [Int] 

這裏a是你的元素類型和要檢查的平等它必須是Eq類的一個實例。

接下來,你顯然希望用比較元素(具有類型的課程a),然後你給的a個列表和功能應該打印出來,其中第一給定值可以在列表中找到indizes(indizes從1開始顯而易見)。

的想法是第一zip你的元素列表與[1..]讓你得到你的indizes然後做平常didive在imepra遞歸算法列表。

positions :: Eq a => a -> [a] -> [Int] 
positions a xs = indexed a (zip xs [1..]) 
    where indexed _ [] = [] 
      indexed a ((x,i):xs) 
      | x == a = i:indexed a xs 
      | otherwise = indexed a xs 

它使用一個內部函數indexed將處理索引列表(在你的榜樣[(1,1),(4,2),(3,3),(7,4),(4,5),(2,6)] - 第二個是指數(見的zip))

先從簡單的情況:一個空的元素列表 - 在那裏你根本找不到你的元素(不管是什麼元素),所以返回空列表。與它的指數(x,i)和索引 -list xs其餘一起 -

如果該列表不爲空,模式匹配的第一個元素。

無論如何,您將需要xs的結果,因此可以通過遞歸調用indexed來獲得結果。

如果x與您正在查找的元素相同a將指數i加到recursiv計算結果中,如果不僅僅返回它。

完成!

這裏就是你們的榜樣:

*Main> positions 4 [1,4,3,7,4,2] 
[2,5] 

如果您沒有看到與zip的伎倆(這個人是經常在Haskell使用,但你必須先看到它)儘量拿出另一內部函數(提示:也許你可以通過周圍的指數作爲參數)...我認爲這可能是一個很好的鍛鍊; Tibial,現在我給你一個解決方案。

我希望這有助於 - 有樂趣

+1

職位a xs = [fst x | x < - zip [1 ..] xs,snd x == a] – karakfa

+2

positions a xs = [i | (I,X)< - 拉鍊[1 ..] XS,X == A] – karakfa

+1

@karakfa很不錯 - 在這裏你解釋推導一下,什麼差別是你爲什麼不做出回答出來的嗎?但基於這個問題,我認爲任務是鍛鍊; Tibial各地列出了基本的遞歸算法 - 這個看起來更像是從pyhton類:d – Carsten

3

問題發生在你比較xelement的事實造成的。在您的簽名類型中,您聲明element的類型爲[a],而(x:xs)的類型爲[a]意味着x的類型爲a==的兩個參數必須具有相同的類型。要麼您需要執行類似[x] == element的操作,或者您需要更改您的類型簽名以使elements的類型爲a


除此之外,您的代碼非常混亂。從我的描述中可以看出,pos的類型應該是Eq a => a -> [a] -> [Int],但是您提供的定義完全不符合該類型。如果您在開始使用Haskell的語法和類型系統時遇到困難,我會建議您檢查Learn You a Haskell,它對該語言有非常平易近人和初學者友好的介紹。