一些背景知识:
我是一名业余程序员,几个月前,在学习了一段时间的 Mathematica 编程(我的第一语言)之后,我利用业余时间学习了 Haskell。我目前正在阅读 Will Kurt 所著的第二本 Haskell 书,但要让自己对 Haskell 代码感到满意还有很长的路要走。到目前为止,Codeabbey 一直是我进行实验和学习的平台。
我编写了一段代码来生成给定数字的排列,处理可能的重复数字,因此对于 588,它将在内部生成 588、858 和 885。
但是,因为我想扩展到相当大的输入数字(认为可能甚至有一百位数字长),所以我不想输出整个列表,然后对其执行计算,而是当场检查生成的每个数字对于某个属性,如果它有,那么我们就有一个获胜者,该数字作为输出返回,并且无需遍历庞大列表的其余部分。如果不幸的是没有找到所需的数字,并且我们未能成功地完成所有可能的排列,它会输出“0”。
我还选择将其设为命令行程序,通过 gnu parallel 向其提供值,以加快工作速度。
所以这是代码
import System.Environment
import Data.List
toDigits :: Integer -> [Integer]
toDigits n = map (\n -> read [n]) (show n)
fromDigits :: Integral a => [a] -> Integer
fromDigits list = fromDigitsHelperFunction list 0
fromDigitsHelperFunction :: Integral a => [a] -> Integer -> Integer
fromDigitsHelperFunction [] acc = acc
fromDigitsHelperFunction (x:[]) acc = (fromIntegral x) + acc …Run Code Online (Sandbox Code Playgroud) haskell ×1