Haskell的`elemIndex`折叠实现

时间:2019-03-24 21:18:07

标签: function haskell fold

我正在查看Haskell elemIndex函数:

elemIndex :: Eq a => a -> [a] -> Maybe Int

Maybe在此定义中是什么意思?有时当我调用它时,输出有一个JustNothing是什么意思?如果要使用折叠,该怎么解释?

3 个答案:

答案 0 :(得分:1)

第一个问题:

  

这是什么意思?

这意味着返回的值要么是索引(Int)要么是空值。

来自docs

  

elemIndex 函数返回给定列表中第一个元素的索引,该索引等于(等于=)查询元素,如果没有则返回 Nothing 这样的元素。

第二个问题:

  

如果我要使用折叠,该怎么解释?

我不确定“使用折叠”部分是否有足够的上下文。但是,至少有两种方法可以使用此功能:

  1. 案例分析,您是否陈述了每种情况的返回结果:
case elemIndex xs of                                                                                           
  Just x -> f x        -- apply function f to x.
  Nothing -> undefined -- do something here, e.g. give a default value.
  1. 使用功能maybe
maybe defaultValue f (elemIndex xs)

答案 1 :(得分:1)

Maybe是求和类型。
总和类型是具有多种可能表示形式的任何类型。
例如:

data Bool = False | True

Bool可以表示为TrueFalse。也许也一样。

data Maybe a = Nothing | Just a

  

Maybe类型封装了一个可选值。
类型为a的值要么包含类型为a(表示为Just a)的值,要么为空(表示为Nothing)

elemIndex :: Eq a => a -> [a] -> Maybe Int

  

elemIndex函数返回给定列表中第一个元素的索引,该索引等于(等于=)查询元素,如果没有这样的元素,则返回Nothing。

让我们将其与indexOf函数进行比较
这种方法的可能值是什么?

  1. 在找到元素的情况下数组中元素的索引(假设2)。
  2. -1,以防找不到。

另一种表示方式:

  1. 返回找到的数字-Just 2
  2. 我们可以返回一个表示
    的值,而不是返回像-1这样的幻数 失败选项-Nothing

关于“如果我要使用褶皱该如何解释”,我没有足够的信息来理解这个问题。

答案 2 :(得分:1)

Maybe是类型构造函数。

Int是一种类型。 Maybe Int是一种类型。

String是一种类型。 Maybe String是一种类型。

对于任何类型aMaybe a是一种类型。其值分为两种:NothingJust 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