【问题标题】:Haskell- find element in a listHaskell-在列表中查找元素
【发布时间】:2015-02-07 07:30:33
【问题描述】:

我想编写一个函数,它接受一个数字 i 和一个数字列表 xs 和 返回i 在列表xs 中的位置,将第一个位置计为1。如果i 确实 在xs 中不出现,则position 返回 0。

到目前为止,我有这个:

import Data.List
position :: Int -> [Int] -> Int
position i xs 
   | i `elem` xs = i `elemIndex` xs
   | otherwise = 0

但是当我编译时,它给出了以下错误:

无法将预期类型“Int”与实际类型“Maybe Int”匹配

我知道elemIndex 返回一个Maybe Int 类型,我定义了我的函数以返回Int,但我不知道如何更改它。有什么想法吗?

【问题讨论】:

  • 如果你确定它总是一个 Just,你可以使用 fromJust(defined in Data.Maybe) 来解开这个值。

标签: haskell


【解决方案1】:

首先,列表使用0… 进行索引。因此,如果 i 恰好是列表的第一个元素,elemIndex 将返回 Just 0

由于elemIndex 返回Maybe Int,您可以对其结果进行模式匹配:

import Data.List (elemIndex)

position :: Eq a => a -> [a] -> Int
position i xs =
    case i `elemIndex` xs of
       Just n  -> n + 1
       Nothing -> 0

【讨论】:

    【解决方案2】:

    我认为,上面的解决方案可能是使用maybe 函数的单线:

    import Data.List
    
    position :: Eq a => a -> [a] -> Int
    position i xs = maybe 0 (+1) $ i `elemIndex` xs
    

    【讨论】:

    • 不需要import Data.Maybe (maybe) 吗?
    • @StéphaneLaurent 没有。 maybePrelude (重新)导出。
    【解决方案3】:

    你甚至可以在 haskell 的标准前奏中使用 zip 函数 :) 只需用 [1..] 压缩它,然后使用它提供的列表理解。 在此处查看代码:

    positions n xs = [y | (y,z) <- zip [1..] xs, z==n]

    要查找出现次数,只需使用标准前奏中的长度:

    positions n xs = length [y | (y,z) <- zip [1..] xs, z==n]

    【讨论】:

      【解决方案4】:

      这可以正常工作:

      =>> findK k l = l !! k
      

      【讨论】:

        猜你喜欢
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2013-01-11
        • 2017-07-20
        • 1970-01-01
        • 2018-12-11
        • 2011-01-12
        相关资源
        最近更新 更多