如何在Haskell中获得列表的中间? [英] Ways to get the middle of a list in Haskell?
问题描述
我正在慢慢地通过(我观看了第一频道的第一部分) 4到目前为止),并在第四视频Erik解释了尾巴如何工作,它让我着迷。
我试着编写一个返回列表中间的函数(2个项目为偶数,1个为奇数),我想听听其他人如何在
- 中实现它。 Haskell代码
- 最快的Haskell代码
如果你可以解释你的选择,非常感谢。
我的初学者代码如下所示:
middle作为|长度> 2 =中间(下降2(反向))
|否则= as
两个版本
-
middle :: [a] - > [a]
middle l @(_:_:_:_)= middle $ tail $ init l
middle l = l
-
使用
length
,take
,signum
,mod
,drop
和div
:
middle :: [a] - > [a]
middle xs = take(signum((l + 1)`mod` 2)+ 1)$ drop((l-1)`div` 2)xs
其中l =长度xs
第二个基本上是一行(但为了可读性,使用其中
)。
I've just started learning about Functional Programming, using Haskel.
I'm slowly getting through Erik Meijer's lectures on Channel 9 (I've watched the first 4 so far) and in the 4th video Erik explains how tail works, and it fascinated me.
I've tried to write a function that returns the middle of a list (2 items for even lengths, 1 for odd) and I'd like to hear how others would implement it in
- The least amount of Haskell code
- The fastest Haskell code
If you could explain your choices I'd be very grateful.
My beginners code looks like this:
middle as | length as > 2 = middle (drop 2 (reverse as))
| otherwise = as
Two versions
Using pattern matching,
tail
andinit
:middle :: [a] -> [a] middle l@(_:_:_:_) = middle $ tail $ init l middle l = l
Using
length
,take
,signum
,mod
,drop
anddiv
:middle :: [a] -> [a] middle xs = take (signum ((l + 1) `mod` 2) + 1) $ drop ((l - 1) `div ` 2) xs where l = length xs
The second one is basically a one-liner (but uses where
for readability).
这篇关于如何在Haskell中获得列表的中间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!