Haskell中的最小值,不包括0

时间:2015-04-09 12:48:56

标签: haskell minimum

我将一个元组列表,例如[(45.4,[9.0]),(0,[9.1])]传递给一个能得到最小的函数

这是我到目前为止的代码

minr :: (Ord a) => [a] -> a 
minr [] = error "List is empty"
minr [x] = x  
minr (x:y:xs) = if x < y then 
                   if x > 0 then minr(x:xs) 
                   else minr(y:xs)
               else minr(y:xs)

我可以使用没有if x&gt;的函数0然后该功能将正常工作,但当我尝试使用&gt;进行比较时0然后它不起作用。

修复我在比较之前删除了0,我知道由于类型声明,比较不起作用,感谢您的帮助

4 个答案:

答案 0 :(得分:2)

因为你的列表是a的列表,它是通用的(而不是数字),所以Haskell不能让你把它比作0 ... 您可以尝试将(Num a, Ord a)设置为约束。

顺便提一句,你当前的代码根本不涉及元组,但我会让你自己解决这个问题。

答案 1 :(得分:1)

不确定元组部分,因为您的示例在数组上运行,但这是一个选项:

 foldl (\a x -> if x==0 then a else min x a)  (maxBound :: Int) [9,15,12,0,5,6,7,8,9]

结果是5。 对于空数组,它会返回maxBound,这是一个非常庞大的数字。

答案 2 :(得分:1)

也许不是最有效的方式,但足够简单。首先滤除零值。然后按升序对剩余部分进行排序,并取第一个(head)。

对于空列表,包括所有零值列表的情况,head将会出错。根据问题陈述/要求,这是明确定义的。

因此考虑,

import Data.List

minr :: (Ord a, Num a) => [(a,[a])] -> (a,[a])
minr = head . sort . filter (\(y,_) -> y /= 0)  

等等

λ> minr [(45.4, [9.0]), (0, [9.1]), (7,[1.2])]
(7.0,[1.2])

然而

λ> minr []
*** Exception: Prelude.head: empty list

λ> minr [(0.0, [9.0]), (0, [9.1]), (0,[1.2])]
*** Exception: Prelude.head: empty list

答案 3 :(得分:0)

这是我得到的答案,可能不太好但是有效

newlist = filter condition tuplename
 where condition (n,_) = n > 0