我需要計算最小的清單,但我嘗試做這種類型的聲明
奧德A => A - > [A] - > [A]
其計算這是不是一個
給定的參數(函數的第一個參數)元素列表小於某一值
mymin :: Ord a => a-> [a] -> [a]
mymin (x:y:xs)
| x > y : mymin(y,xs)
|otherwise
我需要計算最小的清單,但我嘗試做這種類型的聲明
奧德A => A - > [A] - > [A]
其計算這是不是一個
給定的參數(函數的第一個參數)元素列表小於某一值
mymin :: Ord a => a-> [a] -> [a]
mymin (x:y:xs)
| x > y : mymin(y,xs)
|otherwise
只需使用filter
。它是爲過濾列表製作:
mymin :: Ord a => a -> [a] -> [a]
mymin x = filter (< x)
初學者注意:'(
或許你也應該閱讀一些基本的哈斯克爾導向器......不過,兩名提示,以獲得更小的給定列表中的元素列表你要解決這個問題:
mymin
有兩個參數,所以你的代碼的第一行可能應該是編輯:關於第二個想法,你有沒有想過使用filter
?
注:重讀看來你可能只是想過濾器在其他的答案中提到的名單的問題後,我的答案集中在你的初始需求,找到最低列表中的元素。無論如何,我會發布它,希望有人認爲它有用。
你的警衛語法不正確,但你幾乎在那裏與你有什麼。看一下名爲"Guards, guards!" in learn you a haskell的部分。警衛讓您在函數定義中包含多個語句,如if a then b
,if c then d
。
您需要包含otherwise
大小寫的定義,因爲您已將其關閉。
在你的代碼中,你還應該排列|
字符,這個空白是很重要的,它改變了編譯器/解釋器如何運行你的程序。
我想我可以看到你要去的地方,mymin(y,xs)
就好像你試圖回到你的Ord a => a-> [a] -> [a]
類型的函數。然而,正如你所知道的那樣,這是行不通的。您當前的定義mymin (x:y:xs)
只匹配Ord a => [a] -> [a]
,它缺少一個參數。
如果你想傳遞下去的最小值遞歸你需要提供像一個定義:
mymin :: (Ord a) => a -> [a] -> a
mymin x (y:ys)
擴展你的工作我已經想出了以下內容。它返回列表的最小元素,但沒有爲空列表定義(它會出錯)。這是沿着相同的路線,你已經得到了什麼,但保持在列表中的第一個索引最小找到的項目,而不是一起把它當作一個單獨的函數參數:
mymin :: Ord a => [a] -> a
mymin zs = head . mymin' $ zs
where mymin' (x:[]) = [x]
mymin' (x:y:xs)
| x > y = mymin' (y:xs)
| otherwise = mymin' (x:xs)
你能告訴我們你嘗試過什麼以便我們可以幫助您解決特定問題? – Sibi 2014-12-04 10:42:59