在这种情况下,有没有办法在不使用length函数的情况下,在Haskell中得到列表的长度?

rn0zuynd  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(196)

我必须根据以下签名定义一个函数:

indexList :: [a] -> [(Int, a)]

该函数应该将列表元素解压缩为一个元组-元组的第一部分是元组到列表末尾的距离-第二部分是原始元素本身。(必须是递归的,我不能使用length函数)。
期望此测试为真:

indexList [True, False, True] == [(2, True), (1, False), (0, True)]

到目前为止,我已经做到了这一点:

indexList [] = []
indexList (x : xs) = ({-HowFarIsIt-}, x) : indexList xs
jaxagkaj

jaxagkaj1#

你可以查看结果的下一个元组的结果,所以:

indexList :: [a] -> [(Int, a)]
indexList [] = []
indexList [x] = [(0, x)]
indexList (x : xs) = … : ys
    where ys@((i,_):_) = indexList xs

在这里我将填写作为练习。
您还可以使用helper函数来启用总体模式匹配:

import Data.List.NonEmpty(NonEmpty((:|)), (<|))

indexList :: [a] -> [(Int, a)]
indexList [] = []
indexList (x : xs) = let (x :| xs) = indexList' x xs in x : xs

indexList' :: a -> [a] -> NonEmpty [(a, Int)]
indexList' x [] = (0, x) :| []
indexList' x xs = … <| ys
    where ys@((i,_) :| _) = indexList' x xs

相关问题