Haskell折叠实现`elemIndex`

问题描述 投票:-1回答:3

我正在看Haskell elemIndex功能:

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

Maybe在这个定义中意味着什么?有时我称之为输出有JustNothing这是什么意思?如果我使用折叠,我怎么能解释这个?

function haskell fold
3个回答
1
投票

第一个问题:

这是什么意思?

这意味着返回的值是索引(Int)或Nothing。

来自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
投票

Maybe是一种总和类型。 Sum类型是具有多个可能表示的任何类型。 例如:

data Bool = False | True

Bool可以表示为TrueFalse。与Maybe相同。

data Maybe a = Nothing | Just a

Maybe类型封装了一个可选值。 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

关于“如果我使用折叠,我怎么能解释这个”,我没有足够的信息来理解这个问题。


1
投票

Maybe是一个类型构造函数。

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

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

对于任何类型的aMaybe a是一种类型。它的值有两种:NothingJust x,其中xa类型的值(我们写: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
© www.soinside.com 2019 - 2024. All rights reserved.