2014-12-04 67 views
0

我需要計算最小的清單,但我嘗試做這種類型的聲明
奧德A => A - > [A] - > [A]
其計算這是不是一個
給定的參數(函數的第一個參數)元素列表小於某一值

mymin :: Ord a => a-> [a] -> [a] 

mymin (x:y:xs) 
     | x > y : mymin(y,xs) 
      |otherwise 
+0

你能告訴我們你嘗試過什麼以便我們可以幫助您解決特定問題? – Sibi 2014-12-04 10:42:59

回答

2

只需使用filter。它是爲過濾列表製作:

mymin :: Ord a => a -> [a] -> [a] 
mymin x = filter (< x) 
+1

初學者注意:'( a 2014-12-04 11:36:51

0

或許你也應該閱讀一些基本的哈斯克爾導向器......不過,兩名提示,以獲得更小的給定列表中的元素列表你要解決這個問題:

  • 從基本情況開始:空列表和任意透視元素的期望輸出是什麼?
  • mymin有兩個參數,所以你的代碼的第一行可能應該是​​

編輯:關於第二個想法,你有沒有想過使用filter

0

注:重讀看來你可能只是想過濾器在其他的答案中提到的名單的問題後,我的答案集中在你的初始需求,找到最低列表中的元素。無論如何,我會發布它,希望有人認爲它有用。


你的警衛語法不正確,但你幾乎在那裏與你有什麼。看一下名爲"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) 
相關問題