Haskell有什么好的中级问题和项目?

我刚刚开始潜入真实世界Haskell,本书提供了一些良好的练习练习。

但是,我希望针对人们已经解决的具体问题或已完成的项目提出一些建议,这些建议确实帮助他们更好地理解语言及其功能。 我可以把自己扔在什么样的事情上真的会挑战我?

我对语言有适度的理解,以前没有其他功能语言的经验; 哈斯克尔是我第一次跳入这个舞台。


我发现欧拉项目有助于学习基本的语言结构,以帮助我获得Haskell的感受。 当然,这并不是用Haskell创建一个真正的应用程序,但对我而言,这是一种适应语言功能的好方法。 之后,我可能会尝试在Haskell中重新编写一些我的小型python应用程序(其中一些面向GUI)。 所以,这可能是你的下一步,拿出你用另一种语言编写的东西,并尝试在Haskell中完成。


以下是由John Hughes为什么介绍函数编程问题的一个问题:找到将数字化唱片集存档到DVD的最有效方法:

问题如下:

  • 我想将我的音乐收藏存档在DVD上。 一张专辑占用300-600MB,而DVD则拥有4700,000B。 我想将尽可能多的专辑放入DVD中。

    如果两种不同的包装使用相同数量的DVD,我更喜欢那些在最少的DVD上留下最多可用空间的包装,以便所有其他DVD都尽可能地满。

  • 问题是NP难,但基本的步骤是使用标准的贪婪hueristic:
  • 将相册排序成一个列表,最大的一个。
  • 从无限的空白DVD列表开始。
  •   repeat
        take the first album from the list
        put the album in the first DVD that has room for it
      until there are no more albums on the list
    
    刻录所有非空DVD。

    请解决这些编程问题:

  • 通过编写函数来实现标准的贪婪算法
      pack :: [(Album, Integer)] -> [DVD]
    
    哪里
      type Album = String
      type DVD = [Album]
    
    按照Hughes的描述将解决方案分解成单独的函数。
  • 打包的结果是相册出现在列表中的顺序的纯函数。 您可以通过使用泡泡搜索来改进打包:使用以下算法将排序后的列表生成一个新列表:
      repeat
        probabilistically choose an item from the old list
        remove that item from the old list and place it at the end of the
        new list
      until the old list is empty
    
    然后你在扰动列表上执行贪婪打包算法。 如果包装改进了,那么新的订货就成为进一步扰动的基础。

    概率选择通过概率p来参数化:

  • 选择概率为p的第一项
  • 选择概率为p×(1-p)的第二项
  • 选择概率为p×(1-p)^ i-1的第i项
  • 以概率(1-p)^ n-1选择最后一项(在长度为n的列表中)

    问题是通过Bubble Search实现包装

    你的函数可以作为一个参数需要一个无限的随机数列表。

    通过p = 0.45和10,000次迭代,泡泡搜索可以始终如一地生成超过99.5%的DVD填充。

    提示:

  • 尽可能多地重复使用Hughes的组合器。
  • 你需要通过无限数量的随机数列表。 编写新的高阶函数来帮助你这样做。

    我正在(慢慢)学习Haskell,我正在使用48小时内编写自己的计划。 也许它可以帮助你遵循它,如果你想要,你可以随时扩展它。

    链接地址: http://www.djcxy.com/p/14189.html

    上一篇: What are some good intermediate problems and projects for learning Haskell?

    下一篇: How can you do anything useful without mutable state?