我将一个元组列表,例如[(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,我知道由于类型声明,比较不起作用,感谢您的帮助
答案 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