我需要构建自定义Stream数据类型.它类似于列表数据类型,但仅限于无限列表(没有空列表可能性).
我找到了列表数据类型 -
data [] a = a : [a] | []
Run Code Online (Sandbox Code Playgroud)
我写了这个:
data Stream a = a : (Stream a)
Run Code Online (Sandbox Code Playgroud)
但GHCi给出错误信息:
内置语法的非法绑定::
我的数据类型声明有什么问题?
我正在尝试编写一个函数,使用"Sundaram筛选"算法计算1..n中的所有奇素数.
这是我的尝试:
sSund :: Integer -> [Integer]
sSund n = [ i * 2 + 1 | i <- [1..n], j <- [f i], (i + j + 2 * i * j) > n ]
where f 1 = 1
f y = y + 1 --use function f because i don't know how insert 1 into j's list
Run Code Online (Sandbox Code Playgroud)
但它给出了一些错误的数字,如9,15,21,25等.
*Main> sSund 30
[7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我编写了foldTree从列表构建平衡二叉树的函数.我必须使用foldr,它没关系,我使用它,但我使insertInTree函数递归=(现在我只知道这种方式穿过树=)).
更新:我不确定功能insertTree:是否正确计算递归的高度?=((这里需要一些帮助.
是否可以在insertInTree没有递归的情况下编写(使用某些东西until/iterate/unfoldr)或者在foldTree没有辅助函数的情况下编写函数=>以某种方式缩短?
这是我的尝试如下:
data Tree a = Leaf
| Node Integer (Tree a) a (Tree a)
deriving (Show, Eq)
foldTree :: [a] -> Tree a
foldTree = foldr (\x tree -> insertInTree x tree) Leaf
insertInTree :: a -> Tree a -> Tree a
insertInTree x Leaf = Node 0 (Leaf) x (Leaf)
insertInTree x (Node n t1 val t2) = if h1 < …Run Code Online (Sandbox Code Playgroud) 我有树数据类型:
data Tree a = Node
{ rootLabel :: a, -- label value
subForest :: [Tree a] -- zero or more child trees
}
{-- Node (a) [] ..or... Node (a1) [ Node (a2) [..], Node (a3) [..] ] --}
Run Code Online (Sandbox Code Playgroud)
我需要编写treeFold函数,我认为我需要第一个用标签值创建的函数和第二个函数,它取两个func1的结果并得到一些最终结果,依此类推.我开始编写递归函数treeFold,为具有0个子树的最小树写函数,但是我无法完成我的函数,因为没有子树的空列表.
我需要把第一个孩子和其余的孩子列表并从中创建新树以使用这个新树进行递归调用?
treeFold :: (a -> b) -> (b -> b -> b) -> Tree a -> b
treeFold func1 _ (Node a1 []) = func1 a1
treeFold func1 func2 (Node a1 [y]) = func2 (func1 a1) (treeFold func1 func2 …Run Code Online (Sandbox Code Playgroud) 我做下一个作业=)我的任务是创建无限列表与斐波纳契数[0,1,1,2,3,5,8 ..]我可以使用Prelude中的任何函数.
我的尝试:
fibs2 :: [Integer]
fibs2 = reverse $ foldr f [1,0] [0..]
where
f _ (x:y:xs) = (x+y):x:y:xs
Run Code Online (Sandbox Code Playgroud)
此函数仅适用于有限列表,如[0..100],它给出了无限列表:
*** Exception: stack overflow
Run Code Online (Sandbox Code Playgroud)
我做错了什么?如何制作"懒惰"功能?
更新 我的第二次尝试:
fibs4 = 0:[ b | (a, b) <- scanl (\(x,y) _ -> (y,x + y)) (0,1) [0..] ]
Run Code Online (Sandbox Code Playgroud)
它运作正常.:)这是正常的还是奇怪的?
我有问题,我无法弄清楚我必须如何决定我的功能indexJ必须在每一步中选择哪个子树遍历我的平衡二叉树 - JoinList.
想法是缓存每个子树的大小(数据元素的数量).然后可以在每个步骤使用它来确定所需索引是在左侧分支还是右侧分支中.
我有这个代码:
data JoinList m a = Empty
| Single m a
| Append m (JoinList m a) (JoinList m a)
deriving (Eq, Show)
newtype Size = Size Int
deriving (Eq, Ord, Show, Num)
getSize :: Size -> Int
getSize (Size i) = i
class Sized a where
size :: a -> Size
instance Sized Size where
size = id
instance Monoid Size where
mempty = Size 0
mappend = (+)
Run Code Online (Sandbox Code Playgroud)
我写的功能: …