如何在haskell的函数中找到列表的中间元素?
我需要一些 Haskell 的帮助。我是 Haskell 的新手。我想找到列表的中间元素,但我想在函数中执行此操作。我试图找到列表的长度并除以 2。但我未能在函数中将列表的长度设为 int。
findListL k = [z | let z = length k]
我尝试了顶部的代码,但失败了。有人可以告诉我怎么做吗?
回答
我们可以用龟兔赛跑的方法来解决这个问题。我们同时在同一个列表上使用两个迭代器进行迭代。兔子每次走两步,而乌龟向前走一步。如果兔子到了尽头,那么乌龟在中间。因此,我们可以将其实现为:
findListL :: [a] -> a
findListL zs = go zs zs
where go (_:_:xs) ~(_:ys) = go xs ys
go _ (y:_) = y
这将产生:
Prelude> findListL []
*** Exception: <interactive>:(3,9)-(4,22): Non-exhaustive patterns in function go
Prelude> findListL [1]
1
Prelude> findListL [1,2]
2
Prelude> findListL [1,2,3]
2
Prelude> findListL [1,2,3,4]
3
对于空列表,这将引发错误,对于偶数长度的列表,它将采用 index 处的元素(n+1)/2。
由于空列表的计算不起作用,因此通常构造一个函数,该函数返回 a Maybe a,因此Just y如果我们y在中间找到元素,则返回 a ,Nothing如果列表为空,则返回 a 。我把它留作练习。