首页 文章

学习Haskell有哪些好的中间问题和项目? [关闭]

提问于
浏览
11

我刚刚开始潜入Real World Haskell,这本书提供了一些很好的练习练习 .

但是,我想对人们已经解决的具体问题或者他们已经完成的项目提出一些建议,这些建议确实帮助他们更好地理解了语言及其功能 . 我可以抛出什么样的东西真的会挑战我?

我对该语言有一定的了解,之前没有其他功能语言的经验; Haskell是我第一次跳进这个舞台 .

6 回答

  • 1

    我发现Project Euler有助于学习基本的语言结构,以帮助我了解Haskell . 当然,这不是一种很好的方式来熟悉用另一种语言编写的语言,并尝试在Haskell中完成 .

  • 12

    这是John Hughes在Why Functional Programming Matters启发的问题:找到将数字化唱片专辑存档到DVD的最有效方法:

    问题如下:

    • 我想将我的音乐收藏归档于DVD . 一张专辑占用300-600MB,但DVD容量为4,700,000B . 我想把尽可能多的专辑收录到DVD中 .
      如果两个不同的包装使用相同数量的DVD,我更喜欢在最不完整的DVD上留下最多可用空间的DVD,以便所有其他DVD尽可能充满 .

    • 问题是NP难的,但基本步骤是使用标准的贪婪规则:

    • 将相册排序为一个列表,最先放一个列表 .

    • 从无限的空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的组合器 .

    • 您需要查看无限的随机数列表 . 编写新的高阶函数来帮助您这样做 .

  • 2

    我(慢慢)也在学习Haskell,我正在使用教程Write Yourself a Scheme in 48 Hours . 也许它可以帮助你遵循它,如果你想要你可以随时扩展它 .

  • 1

    我建议您查看以下Stack Overflow问题中评分最高的答案 . 我发现建议的研究和活动轨迹是最全面的 . 在中间层面,作者建议修改特定的Monads和库 . 我至少发现它是一个很好的帮助 .

    话虽这么说,我不知道你与其他语言或概念的相对专业水平 . 当我开始寻找中间“挑战”时,我的目标并不高 . 我是世界各个意义上的初学者 . 我会说你对操作列表的任何使用都会成为一个很棒的项目 .

  • 6

    rubyquiz.com有很多很好的练习,可以很好地映射到haskell . haskell wiki有一些但不是全部的haskell实现 .

  • 1

    我发现这个项目很有趣并且有很好的学习记录 .

    https://github.com/jcollard/unm-hip

相关问题