【问题标题】:Having Trouble with tuples in Haskell在 Haskell 中遇到元组问题
【发布时间】:2014-01-19 18:44:04
【问题描述】:

我有这个功能:

pairs :: [a] -> [(a,a)]
pairs xs = zip xs (tail xs)

我必须根据 Pairs 编写另一个,如果至少一对元组按升序排列(例如 (2,3)),则返回 True。

这是我的尝试:

unsorted :: Ord a => [a] -> Bool
unsorted xs = [if fst x < snd x then True else False| x <- pairs xs]

为什么会这样?

【问题讨论】:

    标签: list haskell tuples


    【解决方案1】:

    您的函数返回Bools 的列表,而不是Bool。你可以使用any:

    unsorted xs = any (\x -> fst x < snd x) xs
    

    unsorted = any (\(x, y) -> x < y)
    

    如果你想使用列表推导,你可以添加一个过滤器,然后查看结果列表是否包含任何元素:

    (length [x | x <- pairs xs, fst x < snd x]) > 0
    

    (length [x | (x,y) <- pairs xs, x < y]) > 0
    

    【讨论】:

    • 谢谢,这其实是解决这个问题的一个非常聪明的方法!
    • @user2876457:第二种解决方案(没有any)可以通过使用not (null [x|..])而不是'length [x|..] > 0'变得更加聪明,因为后者将遍历整个列表,但前者将在找到元素后立即返回。例如,这将在尝试评估 unsorted [1..] 时产生影响!
    【解决方案2】:

    查看 GHC 给出的类型错误,您应该会知道错误是什么。

    Couldn't match expected type `Bool' with actual type `[Bool]'
    

    您的签名表明您希望返回Bool,但您的实现会生成Bools 的列表。要解决此问题,请使用函数 (any :: (a -&gt; Bool) -&gt; [a] -&gt; Bool):

    unsorted :: Ord a => [(a, a)] -> Bool
    unsorted xs = any (\(a,b) -> a < b) xs
    

    【讨论】:

    • 我需要使用函数对来获取元组列表,然后检查第一个元素是否小于第二个元素。如果它返回 True 否则继续查找其他元组。如果在这些条件下没有任何内容,则返回 false。你能帮我解决这个问题吗?因为你的函数不使用对
    • pairs 函数返回一个元组列表:[a] -&gt; [(a,a)]unsorted 函数接受一个元组列表[(a, a)]。由于这听起来像是家庭作业,我将由您来决定如何组合这两个函数。
    • 其实这是去年考试的一个练习。因为我今年要买一个,所以我想弄清楚,但还是谢谢!
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多