如何在Haskell中获得列表的中间? [英] Ways to get the middle of a list in Haskell?

查看:88
本文介绍了如何在Haskell中获得列表的中间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在慢慢地通过(我观看了第一频道的第一部分) 4到目前为止),并在第四视频Erik解释了尾巴如何工作,它让我着迷。



我试着编写一个返回列表中间的函数(2个项目为偶数,1个为奇数),我想听听其他人如何在


  • 中实现它。 Haskell代码

  • 最快的Haskell代码



如果你可以解释你的选择,非常感谢。



我的初学者代码如下所示:

  middle作为|长度> 2 =中间(下降2(反向))
|否则= as


解决方案

两个版本




  1. 使用模式匹配, tail init

      middle :: [a]  - > [a] 
    middle l @(_:_:_:_)= middle $ tail $ init l
    middle l = l


  2. 使用 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

  1. Using pattern matching, tail and init:

    middle :: [a] -> [a]
    middle l@(_:_:_:_) = middle $ tail $ init l
    middle l           = l
    

  2. Using length, take, signum, mod, drop and div:

    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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆