我正在看Haskell elemIndex
功能:
elemIndex :: Eq a => a -> [a] -> Maybe Int
Maybe
在这个定义中意味着什么?有时我称之为输出有Just
或Nothing
这是什么意思?如果我使用折叠,我怎么能解释这个?
第一个问题:
这是什么意思?
这意味着返回的值是索引(Int)或Nothing。
来自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)
Maybe
是一种总和类型。
Sum类型是具有多个可能表示的任何类型。
例如:
data Bool = False | True
Bool
可以表示为True
或False
。与Maybe相同。
data Maybe a = Nothing | Just a
Maybe类型封装了一个可选值。 Maybe a类型的值包含a类型的值(表示为Just a),或者它是空的(表示为Nothing)
elemIndex :: Eq a => a -> [a] -> Maybe Int
elemIndex函数返回给定列表中与查询元素相等(通过==)的第一个元素的索引,如果没有这样的元素,则返回Nothing。
让我们将它与indexOf
函数进行比较
这种方法有什么可能的价值?
另一种表示方式:
Just 2
。Nothing
。关于“如果我使用折叠,我怎么能解释这个”,我没有足够的信息来理解这个问题。
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