小编Сер*_*кий的帖子

内置语法的非法绑定:`:`

我需要构建自定义Stream数据类型.它类似于列表数据类型,但仅限于无限列表(没有空列表可能性).

我找到了列表数据类型 -

data [] a = a : [a] | []
Run Code Online (Sandbox Code Playgroud)

我写了这个:

data Stream a = a : (Stream a)
Run Code Online (Sandbox Code Playgroud)

但GHCi给出错误信息:

内置语法的非法绑定::

我的数据类型声明有什么问题?

haskell stream

10
推荐指数
2
解决办法
1242
查看次数

筛选Sundaram - 列表理解

我正在尝试编写一个函数,使用"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)

我究竟做错了什么?

haskell list-comprehension sieve

8
推荐指数
1
解决办法
1276
查看次数

使用foldr构建平衡二叉树

我编写了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)

recursion binary-tree haskell fold higher-order-functions

7
推荐指数
1
解决办法
3645
查看次数

treeFold函数中的递归

我有树数据类型:

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)

tree haskell fold

3
推荐指数
1
解决办法
363
查看次数

用Fibonacci数创建无限列表

我做下一个作业=)我的任务是创建无限列表与斐波纳契数[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)

它运作正常.:)这是正常的还是奇怪的?

haskell list fibonacci infinite lazy-evaluation

2
推荐指数
1
解决办法
1807
查看次数

平衡二叉树的索引函数

我有问题,我无法弄清楚我必须如何决定我的功能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)

我写的功能: …

binary-tree haskell monoids

2
推荐指数
1
解决办法
350
查看次数