haskell - 确定元素在列表中的位置的递归 Haskell 函数
问题描述
我有这段代码将返回 char 数组中 char 的索引,但如果该值不在数组中,我希望我的函数返回类似 -1 的内容。就目前而言,如果元素不在数组中,则函数返回数组的大小。关于如何更改我的代码以应用此功能的任何想法?
我试图不使用任何花哨的功能来做到这一点。我只想要没有内置函数的简单代码。
isPartOf :: [(Char)] -> (Char) -> Int
isPartOf [] a = 0
isPartOf (a:b) c
| a == c = 0
| otherwise = 1 + isPartOf b c
例如:
*Main> isPartOf [('a'),('b'),('c')] ('z')
3
但我想要:
*Main> isPartOf [('a'),('b'),('c')] ('z')
-1
解决方案
让我们尝试定义这样一个函数,但是-1
如果元素不是列表的一部分,我们可以返回,而不是返回Nothing
:
isPartOf :: Eq a => [a] -> a -> Maybe Int
isPartOf [] _ = Nothing
isPartOf (x : xs) a | x == a = Just 0
| otherwise = fmap ((+) 1) (isPartOf xs a)
所以,它是这样工作的:
>> isPartOf [('a'),('b'),('c')] ('z')
Nothing
it :: Maybe Int
>> isPartOf [('a'),('b'),('c')] ('c')
Just 2
it :: Maybe Int
之后,我们可以使用内置函数fromMaybe
将Nothing
大小写转换为-1
:
>> fromMaybe (-1) $ isPartOf [('a'),('b'),('c')] ('c')
2
it :: Int
>> fromMaybe (-1) $ isPartOf [('a'),('b'),('c')] ('z')
-1
it :: Int
如果您对这样的功能已经存在感到好奇,您可以使用 Hoogle,搜索[a] -> a -> Maybe Int
功能:https ://www.haskell.org/hoogle/?hoogle=%5Ba%5D+-%3E+a+-% 3E+也许+智力
第一个答案是elemIndex
:
>> elemIndex 'c' [('a'),('b'),('c')]
Just 2
it :: Maybe Int
>> elemIndex 'z' [('a'),('b'),('c')]
Nothing
it :: Maybe Int
希望这可以帮助。
推荐阅读
- macos - 为 Mac 应用程序安装本机消息传递主机
- ruby-on-rails - Rails Scoped 有很多 through 有很多 with 范围
- java - 在android上的firebase firestore中删除一个数组值
- javascript - 三个 js 使用具有应用角度的矢量移动对象
- duplicates - 精简流入数据库时间序列/删除重复项
- objective-c - 当通过自动布局调整大小时,如何为 NSWindow 的大小更改设置动画?
- rxjs - 如何将映射值组合到可观察数组?
- xml - XML 元素名称中允许的符号
- docker - 如何使 docker 镜像保持最新?
- excel - SendKeys 的 VBA 条件单元格