对于我的另一个答案,我编写了以下代码,为可枚举的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) 我有一个有限列表的函数
> 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)
但是我不确定它是否有帮助,因为拥抱只会在没有中断的情况下发出对.
感谢帮助.
给定以下数据类型定义:
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) 假设我们在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.