如何逐个元素遍历列表

7 haskell loops list pattern-matching

我刚刚开始学习 Haskell,我正在尝试编写一些基本函数,以便更好地理解这种语言。

我想编写一个函数,它接受一个列表和一个Int( N) 作为参数并返回N列表中索引处的元素,而不使用!!运算符或任何内置函数。

这是我尝试过的:

myHead :: [a] -> a
myHead (x:_) = x
myHead [] = error "head: empty list"

myNth :: [a] -> Int -> a
myNth x i = if i < 0
  then error "nth: index can't be negative"
  else myNthIterator x i 0

myNthIterator :: [a] -> Int -> Int -> a
myNthIterator [] i n = error "nth: bad index"
myNthIterator (_:x) i n = if i == n
  then myHead x
  else myNthIterator x i ( n + 1 )
Run Code Online (Sandbox Code Playgroud)

它有效,但它向右移动。例如myNth [1, 2, 3, 4] 2会给4而不是3

据我了解,(_:x)删除了列表的第一个元素,我不知道如何逐个元素地遍历列表。

有人可以让我走上这条路吗?我发现很难为初学者找到这种语言的资源。

414*_*wen 7

我们可以Maybe用来建模索引是否有效。

nth :: Int -> [a] -> Maybe a
nth 0 (x : _) = Just x
nth n (x : xs) = nth (n - 1) xs
nth _ [] = Nothing
Run Code Online (Sandbox Code Playgroud)

我们可以对索引进行模式匹配以获取我们的基本情况,并通过列表获取第一个元素和尾部。