解决Haskell中的Euler#31

时间:2014-08-03 18:00:42

标签: haskell

我将我的解决方案与haskell.org http://www.haskell.org/haskellwiki/Euler_problems/31_to_40上发布的解决方案进行了比较,并且不知道该怎么想。我写的是非惯用的,平均的haskell开发人员会立即将我的代码弹射到月球上吗?

main =
  print $ length $ split 200

split n = split' [200, 100, 50, 20, 10, 5, 2, 1] n
  where split' (1:[]) n = [take n $ repeat 1]
        split' (c:cs) n
          | n > c     = map (c:) (split' (c:cs) (n - c)) ++ split' cs n
          | n == c    = [[c]] ++ split' cs n
          | otherwise = split' cs n

来自" enterprisey"开发我有点直接和愚蠢的解决方案,但另一方面也许每个人都可以阅读单行,我只需要拿起我的游戏?你会建议压缩代码作为练习,还是仅仅针对黑客?

1 个答案:

答案 0 :(得分:8)

作为一般规则,您可以说如果其他人有可能阅读您编写的代码,您应该煞费苦心地描述代码中的每一步,即使这意味着您必须再写十行以上快速而时髦的解决方案。

如果您只为自己编写代码,那么您可以随心所欲地执行任何操作,但您必须记住,您可能希望了解您在很长一段时间内在硬盘上找到的代码。

压缩它可能是一个有用的东西,学习如何使用Haskell的特殊功能和吹牛("我在一行中解决了!!")但是否则人们不能忽视重要的可读性和可维护性。

较长代码的另一个优点是,如果代码的行为不符合预期,则更容易调试,因为它的格式类似于它的逻辑结构(如果格式正确),因此跟踪错误很多更容易。