Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 发现n';序列1/11/21/1中的第th代_Haskell - Fatal编程技术网

Haskell 发现n';序列1/11/21/1中的第th代

Haskell 发现n';序列1/11/21/1中的第th代,haskell,Haskell,我正在尝试建立一个Haskell程序,它会按照标题所说的那样做。基本上每个单元格都对应于它前面的单元格,第二个单元格表示前一个单元格中只有一个“1”,第三个单元格表示前一个单元格中有两个“1”,依此类推 我对haskell和它的语法非常陌生,所以我收到了大量的错误,这些错误对我没有帮助,所以我使用这个论坛来获得一些帮助 这是我的代码: findGen :: a -> a findGen(x) = (getList (x))!!x getList :: a -> [a] getLis

我正在尝试建立一个Haskell程序,它会按照标题所说的那样做。基本上每个单元格都对应于它前面的单元格,第二个单元格表示前一个单元格中只有一个“1”,第三个单元格表示前一个单元格中有两个“1”,依此类推

我对haskell和它的语法非常陌生,所以我收到了大量的错误,这些错误对我没有帮助,所以我使用这个论坛来获得一些帮助

这是我的代码:

findGen :: a -> a
findGen(x) = (getList (x))!!x

getList :: a -> [a]
getList (0) = []
getList (1) = [1]
getList (x) = getList(x-1) : ys where 
                            y = Ord getList(x-1) 
                            zs = group y
                            ds = countify(zs)
                            ys = concat(ds)

group :: Eq a => [a] -> [[a]]
group [] = []
group (x:xs) = (x:ys) : group zs where (ys,zs) = span ((==) x )xs


countify :: [a] -> [a]
countify(x:xs) = (y:xs) where y = count(x)
我想做的是这样的: FindGen只是一个返回序列中第n个元素的函数。 getList是构建序列的函数,我试图使用Ord将其创建到上一个列表中,以便对其进行分组,然后使用count计算每个数字使用countify显示的次数,然后将列表合并为字符串。 试图找出我错在哪里,可能是在语法上,因为我认为这个想法是好的

谢谢

我试图用Ord创建它

如果要对列表进行排序,请使用
排序
(如果我没记错的话,请从Data.list)

另外,请注意,由于您提供的类型签名错误,编译器将不接受
getList
。使用
Integer
而不是
a
就可以了。以相同的方式修复
findGen
的签名。或者更好的是,在您更加熟悉类型系统之前,不要给出任何类型签名


此外,什么是计数?为什么您需要重新实现

如果我有正确的模式,您可以通过使用
数据.Map
和使用
数据中迭代
。以惰性方式列出
,如下所示;(感谢@luqui在地图上的简化)


有趣的是,它没有超出第13次迭代的结果“14233221”。刚刚会合。

我将提供一个不同的想法。考虑你的列表如下,

  • 有一个种子
    “1”
  • 要增加列表,只需依赖上一个元素
  • 因此,它是一个不动点,通过回顾1个元素,可以通过指定基本情况和归纳情况来实现,然后将它们连接起来

    它的结果是两个班轮

    import Data.List (group, sort)
    
    genList :: [String]
    genList = "1" : map grow genList
      where grow s = (group $ reverse $ sort s) >>= (\n@(h:_) -> show (length n) ++ [h])
    
    main :: IO ()
    main = putStrLn $ show $ take 13 genList
    
    希望它是正确的

    ["1","11","21","1211","1231","131221","132231","232221","134211","14131231","14231241","24132231","14233221"]
    

    除非进行模式匹配,否则在函数调用或函数中不需要使用括号
    findGen(x)
    应该是
    findGen x
    ys=countify(zs)
    应该是
    ys=countify zs
    。唯一需要方括号的时候是在
    (x:xs)
    之类的东西上进行模式匹配,或者在将其传递给函数之前做一些工作,就像您在
    getList(x-1)
    中所做的那样,您的意思是生成(1,11,21,1211,111221,31211,13112221,1113211,…)?到目前为止,答案似乎解决了一个不同的问题。哦,不介意,我们需要重新创建它作为练习的一部分。好的,我已经修复了你们说的任何问题,但是它仍然给了我奇怪的错误main.hs:19:13:error:Not in scope:type构造函数或class'List'main.hs:19:21:error:Not in scope:type构造函数或class'List'@The_C当我们看不到新代码时,很难说问题出在哪里,但List不是序曲中的关键字。带大写字母的关键字通常是数据构造函数,但要创建列表,我们使用方括号来创建列表,而不是构造函数
    makeMap
    要简单得多。查看
    fromListWith
    @luqui嘿,非常感谢您指出
    fromListWith
    。我希望能找到更简单的方法来满足这一基本需求。我将据此更正。
    makeMap :: String -> M.Map Char Int
    makeMap = M.fromListWith (+) . map (flip (,) 1)
    
    generateList :: [String]
    generateList = iterate getChrCnt "1"
                   where
                   getChrCnt = M.foldrWithKey (\k n a -> a ++ show n ++ [k]) "" . makeMap
    
    *Main> take 13 $ generateList
    ["1","11","21","1211","1231","131221","132231","232221","134211","14131231","14231241","24132231","14233221"]
    
    import Data.List (group, sort)
    
    genList :: [String]
    genList = "1" : map grow genList
      where grow s = (group $ reverse $ sort s) >>= (\n@(h:_) -> show (length n) ++ [h])
    
    main :: IO ()
    main = putStrLn $ show $ take 13 genList
    
    ["1","11","21","1211","1231","131221","132231","232221","134211","14131231","14231241","24132231","14233221"]