對於我在哈斯克爾的第一次演講,我們給出了一系列問題。其中之一是在列表中存在n個數字時返回True,否則返回False。我設法得到了我認爲在那裏的一半,但是得到了不同的編譯錯誤,並且非常沮喪,因爲我甚至可以理解它們的意思。Haskell:寫一個函數來複制``ellem'
到目前爲止,我已經做了以下
// No problem with this function
matches :: Int -> [Int] -> [Int] // This function is to return the matches
matches x y = [a | a <-y, a==x] // ie. main> 1 [1,3,5,7,1,4] outputs [1,1]
// Here am stuck
myelem :: Int -> [Int] -> Bool
myelem x [] = False
myelem x (y:ys)
| x == y = y : x myelem ys // Am not sure about recursion as
// we have not yet covered
顯然,這是一類,所以請不要發佈答案。但也許有一些例子可以幫助我推理Haskell的運作以及如何解決這個問題。任何指針都將被大量讚賞。
SOLUTION
matches :: Int -> [Int] -> [Int]
matches x y = [a | a <-y, a==x]
myelem :: Int -> [Int] -> Bool
myelem x [] = False
myelem x (y:ys)
| x == y = True
| otherwise = myelem x (ys)
乾杯傢伙
@pelotom,@Jeremiah Willcock,@ 9000:非常感謝這麼多人,我只是覺得把我的推理從強制性轉變爲陳述性是非常具有挑戰性的。只是爲了澄清;當`myelem x(ys)`被執行時,它實際上是否從列表中刪除了元素直到爲空,還是僅僅評估列表上剩餘的元素,直到沒有剩下的元素爲止? – Carlos 2011-02-19 03:13:17