Haskell 中的最小值不包括 0

Min value in Haskell excluding 0

我将一个元组列表例如 [(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 > 0 的情况下使用该函数,那么该函数将正常工作,但是当我尝试使用 > 0 比较它时,它不起作用。

修复我在比较之前删除了 0 并且我知道由于类型声明导致比较无法正常工作感谢您的帮助

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

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

因为您的列表是 a 的列表,它是通用的(而不是数字),Haskell 不能让您只将它与 0 进行比较... 您可以尝试将 (Num a, Ord a) 设置为约束条件。

顺便说一下,您当前的代码根本不处理元组,但我会让您自己解决这个问题。

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

 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,这是一个相当大的数字。

也许不是最有效的方法,但足够简单。首先过滤掉零值。然后将剩余的按升序排列,取第一个(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