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