列表在Haskell建设

Jon*_*FTW 1 constructor haskell

我有项目euler 问题的以下递归函数.74:

chain n | n `elem` xs = length xs
        | otherwise = (chain (sumFac n)) : xs
fac n = foldl (*) 1 $ enumFromTo 1 n
sumFac n = sum $ map fac $ decToList n
Run Code Online (Sandbox Code Playgroud)

除了我不知道构造列表的正确语法,chain n以便它建立一个列表xs然后返回xs一个数字再次出现在列表中xs并开始循环的长度.

我如何纠正我的链功能以使其工作?

Gre*_*con 5

使用辅助函数:

chain n = go [n]
  where go xs | next `elem` xs = reverse $ next : xs
              | otherwise      = go (next:xs)
          where next = sumFac $ head xs

fac = product . enumFromTo 1

sumFac = sum . map fac . map digitToInt . show
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,你接近你想要的东西,但你把两者模糊在一起.

为了好玩,我扔了无点的facsumFac.

这是一个使用视图模式的无点定义(但是,唉,似乎发痒#2395):

{-# LANGUAGE ViewPatterns #-}

chain = head . filter hasDup . tail . inits . iterate sumFac
  where hasDup (reverse -> (x:xs)) = x `elem` xs
Run Code Online (Sandbox Code Playgroud)

  • 啊哈!使用`Control.Arrow`,`chain = snd.头.过滤器(uncurry elem).不发达的拉链.(id &&& inits).迭代sumFac`变为无点. (3认同)