相关疑难解决方法(0)

枚举通用实例的所有值时的无限递归

对于我的另一个答案,我编写了以下代码,为可枚举的s 提供了对角遍历的 Universe实例Generic(它从那里的版本略微更新,但使用相同的逻辑):

{-# LANGUAGE DeriveGeneric, TypeOperators, ScopedTypeVariables #-}
{-# LANGUAGE FlexibleInstances, FlexibleContexts, DefaultSignatures #-}
{-# LANGUAGE UndecidableInstances, OverlappingInstances #-}

import Data.Universe
import Control.Monad.Omega
import GHC.Generics
import Control.Monad (mplus, liftM2)

class GUniverse f where
    guniverse :: Omega (f x)

instance GUniverse U1 where
    guniverse = return U1

instance (Universe c) => GUniverse (K1 i c) where
    guniverse = fmap K1 $ each (universe :: [c])        -- (1)

instance (GUniverse f) => GUniverse (M1 i …
Run Code Online (Sandbox Code Playgroud)

haskell strictness ghc-generics

9
推荐指数
1
解决办法
160
查看次数

无限列表的笛卡儿积分haskell

我有一个有限列表的函数

> kart :: [a] -> [b] -> [(a,b)]
> kart xs ys = [(x,y) | x <- xs, y <- ys]
Run Code Online (Sandbox Code Playgroud)

但如何为无限列表实现它?我听说过Cantor和集合理论......

我也发现了一个类似的功能

> genFromPair (e1, e2) = [x*e1 + y*e2 | x <- [0..], y <- [0..]]
Run Code Online (Sandbox Code Playgroud)

但是我不确定它是否有帮助,因为拥抱只会在没有中断的情况下发出对.

感谢帮助.

haskell

4
推荐指数
1
解决办法
1000
查看次数

生成所有可能的树

给定以下数据类型定义:

data FormTree = Empty | Node FormTree FormTree deriving Show
Run Code Online (Sandbox Code Playgroud)

我想编写一个函数,它生成一个无限列表,其中包含按长度排序的所有可能的树,例如节点的数量.

下面的代码几乎可以满足我的需要,但它只是通过每次插入额外的节点来降低右侧的树,但我需要它在两边之间交替.

allPossibleTrees :: [FormTree]
allPossibleTrees = Empty : [Node x y | x <- recursive, y <- recursive]
    where recursive = allPossibleTrees
Run Code Online (Sandbox Code Playgroud)

执行

take 5 allPossibleTrees
Run Code Online (Sandbox Code Playgroud)

得到:

[Empty,Node Empty Empty,Node Empty (Node Empty Empty),Node Empty (Node Empty (Nodes Empty Empty)),Node Empty (Node Empty (Node Empty (Node Empty Empty)))]
Run Code Online (Sandbox Code Playgroud)

但它应该是这样的:

[Empty,Node Empty Empty,Node (Node Empty Empty) Empty,Node Empty (Node Empty Empty),Node (Node Empty Empty) (Node Empty Empty)]
Run Code Online (Sandbox Code Playgroud)

binary-tree haskell list-comprehension catalan

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

计算所有有限Blurgs的无限列表

假设我们在Haskell中定义了以下数据类型:

data Blurg = Blub
           | Zarg
           | Parg Blurg Blurg
Run Code Online (Sandbox Code Playgroud)

这意味着Zarg,Parg Blub (Parg Zarg Zarg),Parg (Parg Blub Blub) (Parg Blub Blub)等,是所有实例Blurgs.

现在一个旧的考试问题如下:

定义一个函数,它将计算所有Blurgs的列表.

所以我尝试过:

allBlurg' :: [Blurg] -> [Blurg]
allBlurg' sofar = sofar ++ allBlurg' [Parg x y | x <- sofar, y <- sofar]

allBlurg :: [Blurg]
allBlurg = allBlurg' [Blub, Zarg]
Run Code Online (Sandbox Code Playgroud)

起初我认为这是一个解决方案,但后来我意识到并非所有可能的Blurgs都包含在结果列表中allBlurg.有人能写一个合适的解决方案吗

顺便说一句,我只想指出,问题所要求的并不是真正的功能,因为它不需要任何参数; 它应该被视为一个价值.其次,虽然问题没有明确说明,但我认为这应该是每个Blurg只在列表中出现一次的条件.另请注意,问题实际上应该只是询问用户zch在评论中提到的有限Blurgs.

haskell

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