我的问题可能非常简单和基本,但我觉得到目前为止我还错过了一个关键的东西。
我的目标是计算[[Int]]
列表在任意给定索引下的列表长度。
例如,listLength[[1,2],[1,2,3],[1,2,3,4]] 3
应该得到4
。我的函数如下
listLength :: [[Int]] -> Int -> Int
listLength (x:[xs]:[[xxs]]) n = length ((x:[xs]:[[xxs]]) !! n)
也可以编译,但是每当我使用类似于上面的参数调用它时,我都会得到函数异常中的非详尽模式。
我认为我在这里缺少的是必须为1)列表定义一个合适的模式的部分。[[Int]]
列表内可变长度,但也有2)由[[Int]]
列表组成的[Int]
列表中的可变长度
我已经尝试了x:[xs]
来模拟2),[xs]:[[xxs]]
用于模拟1)。但是,我仍然收到没有匹配模式的错误。
我怎样才能模拟前面的叙述?如有任何帮助,我将不胜感激。
您寻找的模式是…xss
:
listLength :: [[Int]] -> Int -> Int
listLength xss n = length (xss !! n)
请注意,它使用的索引从0开始,像往常一样。如果您需要索引从1开始,请使用length (xss !! (n-1))
。
使用过于复杂的模式是一个相当常见的错误,只是因为人们觉得在列表的列表上工作需要对列表进行一些特殊的注意。然而,这是在转移注意力。注意类型:
xss :: [[Int]]
n :: Int
xss !! n :: [Int] -- since that's the element type of [[Int]]
length (xss !! n) :: Int
同样,没有必要为空/非空列表设置特殊情况:length
已经处理了所有情况。