Haskell-在列表中查找元素

时间:2014-12-09 11:55:59

标签: haskell

我想编写一个带有数字i的函数和一个数字列表xs和 返回列表ixs的位置,将第一个位置计为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,但我不知道如何更改它。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

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

import Data.List

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

答案 1 :(得分:4)

首先,列表使用0…编制索引。如果elemIndex恰好是您列表中的第一个元素,Just 0将返回i

由于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 :(得分:0)

你甚至可以在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]

答案 3 :(得分:0)

这正常工作:

=>> findK k l = l !! k