如何在haskell中显示给定范围的列表

时间:2018-10-08 22:57:45

标签: list haskell slice

如何编写在Haskell列表中显示给定范围的函数?说我有功能:

dispRange l x y

在给定值时:

dispRange [1,2,4,5,6,7] 0 3 

显示位置0到3的所有元素,因此返回的列表为:

[1,2,4,5]

3 个答案:

答案 0 :(得分:6)

为此,我们可以结合使用drop :: Int -> [a] -> [a]take :: Int -> [a] -> [a]

对于范围ij,我们首先 drop i个元素,然后 take j-i+1元素(由于两个索引均为 ,因此我们需要添加一个)。

例如:

dispRange :: [a] -> Int -> Int -> [a]
dispRange l i j = take (j-i+1) (drop i l)

我们可以防止负数和j小于i的情况,

dispRange :: [a] -> Int -> Int -> Maybe [a]
dispRange l i j | i < 0 || j < i = Nothing
                | otherwise = Just (take (j-i+1) (drop i l))

答案 1 :(得分:2)

dispRange使用一个列表:l,开始位置:x和结束位置:y(包括一个范围)。如果范围不是负数,它将返回该范围内的元素。

import Data.List ((\\))

dispRange :: Eq a => [a] -> Int -> Int -> [a]
dispRange l x y  
  | x <= y = (\\) <$> take (y + 1) <*> take x $ l
  | otherwise = []

答案 2 :(得分:1)

如果您想以一种不使用内置功能的方式进行操作(供初学者学习),则可以将其分为两个阶段:

  1. 关闭第一个 x 元素,以递归方式调用您的函数并根据需要更改参数。
  2. 返回下一个 y 元素,以递归方式调用函数并根据需要更改参数。

您的代码将如下所示:

dispRange :: …
dispRange … … … = []
dispRange … … … = dispRange … … …
⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮
dispRange … … … = dispRange … … …

所以,问题是:

  • 参数的类型和返回的值是什么?
  • 上面第一阶段的基本案例和递归案例的输入是什么样的?
  • 上面第二阶段的基本案例和递归案例的输入是什么样的?

现在,您可以在等号的左侧写入类型签名和模式(请记住,上方的模式优先于下方的模式,因此请对其进行正确排序)。然后,您可以在等号的右边编写每种情况的实现。


如果遇到问题,另一种方法是尝试制作一个仅执行一个的函数。然后,尝试制作仅执行第二阶段的功能。然后,在您的dispRange函数中使用这些函数。