我想编写一个带有数字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
,但我不知道如何更改它。有什么想法吗?
答案 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