如何编写在Haskell列表中显示给定范围的函数?说我有功能:
dispRange l x y
在给定值时:
dispRange [1,2,4,5,6,7] 0 3
显示位置0到3的所有元素,因此返回的列表为:
[1,2,4,5]
答案 0 :(得分:6)
为此,我们可以结合使用drop :: Int -> [a] -> [a]
和take :: Int -> [a] -> [a]
:
对于范围i
至j
,我们首先 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)
如果您想以一种不使用内置功能的方式进行操作(供初学者学习),则可以将其分为两个阶段:
您的代码将如下所示:
dispRange :: …
dispRange … … … = []
dispRange … … … = dispRange … … …
⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮
dispRange … … … = dispRange … … …
所以,问题是:
现在,您可以在等号的左侧写入类型签名和模式(请记住,上方的模式优先于下方的模式,因此请对其进行正确排序)。然后,您可以在等号的右边编写每种情况的实现。
如果遇到问题,另一种方法是尝试制作一个仅执行一个的函数。然后,尝试制作仅执行第二阶段的功能。然后,在您的dispRange
函数中使用这些函数。