我正在查看Haskell elemIndex
函数:
elemIndex :: Eq a => a -> [a] -> Maybe Int
Maybe
在此定义中是什么意思?有时当我调用它时,输出有一个Just
或Nothing
是什么意思?如果要使用折叠,该怎么解释?
答案 0 :(得分:1)
第一个问题:
这是什么意思?
这意味着返回的值要么是索引(Int)要么是空值。
来自docs:
elemIndex 函数返回给定列表中第一个元素的索引,该索引等于(等于=)查询元素,如果没有则返回 Nothing 这样的元素。
第二个问题:
如果我要使用折叠,该怎么解释?
我不确定“使用折叠”部分是否有足够的上下文。但是,至少有两种方法可以使用此功能:
case elemIndex xs of
Just x -> f x -- apply function f to x.
Nothing -> undefined -- do something here, e.g. give a default value.
maybe defaultValue f (elemIndex xs)
答案 1 :(得分:1)
Maybe
是求和类型。
总和类型是具有多种可能表示形式的任何类型。
例如:
data Bool = False | True
Bool
可以表示为True
或False
。也许也一样。
data Maybe a = Nothing | Just a
Maybe类型封装了一个可选值。
类型为a的值要么包含类型为a(表示为Just a)的值,要么为空(表示为Nothing)
elemIndex :: Eq a => a -> [a] -> Maybe Int
elemIndex函数返回给定列表中第一个元素的索引,该索引等于(等于=)查询元素,如果没有这样的元素,则返回Nothing。
让我们将其与indexOf
函数进行比较
这种方法的可能值是什么?
另一种表示方式:
Just 2
。Nothing
。关于“如果我要使用褶皱该如何解释”,我没有足够的信息来理解这个问题。
答案 2 :(得分:1)
Maybe
是类型构造函数。
Int
是一种类型。 Maybe Int
是一种类型。
String
是一种类型。 Maybe String
是一种类型。
对于任何类型a
,Maybe a
是一种类型。其值分为两种:Nothing
或Just x
,其中x
是类型a
的值(我们写为:x :: a
):
x :: a
----------------- ------------------
Just x :: Maybe a Nothing :: Maybe a
在第一个规则中,值a
的类型和值x :: a
的类型的Just x :: Maybe a
是相同的。因此,如果我们知道x
的类型,我们就知道Just x
的类型;反之亦然。
在第二条规则中,值Nothing
本身中的任何内容都不能确定其类型的a
。将根据如何使用(即根据其使用情况,从其调用站点)来确定该值。
关于elemIndex
的折叠实现,例如
elemIndex_asFold :: Eq a => a -> [a] -> Maybe Int
elemIndex_asFold x0 = foldr g Nothing
where
g x r | x == x0 = Just x
| else = r