我想编写一个函数,接受一个数字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
Run Code Online (Sandbox Code Playgroud)
但是当我编译时,它会给出以下错误:
无法将预期类型'Int'与实际类型'Maybe Int'匹配
我知道elemIndex返回一个Maybe Int类型,我定义了我的函数返回Int但我不知道如何更改它.有任何想法吗?
首先,列表以0…. 如果恰好是列表的第一个元素,那么elemIndex将返回。Just 0i
由于elemIndexreturn 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
Run Code Online (Sandbox Code Playgroud)
我认为,上面的解决方案可能是使用该maybe功能的单线程:
import Data.List
position :: Eq a => a -> [a] -> Int
position i xs = maybe 0 (+1) $ i `elemIndex` xs
Run Code Online (Sandbox Code Playgroud)