Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell:无限列表的有限列表上的重复乘法序列器_Haskell_Stack Overflow_Infinite - Fatal编程技术网

haskell:无限列表的有限列表上的重复乘法序列器

haskell:无限列表的有限列表上的重复乘法序列器,haskell,stack-overflow,infinite,Haskell,Stack Overflow,Infinite,给定一个无限列表的有限列表,或者一个无限列表的无限列表,我想应用一个乘法运算符(~>)或(~>)或(>*>),如果你愿意的话,它符合分布属性: [[a], [b], [c]] >*> [[d], [e]] == [[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]] 这也适用于(~>),以及(~~>)转置表示 然后我想“永远”重复这个乘法运算符`` 以下是我的尝试,所有这些都是由于相互依赖(我认为)导致的堆栈溢出或永不终止 例1: impo

给定一个无限列表的有限列表,或者一个无限列表的无限列表,我想应用一个乘法运算符
(~>)
(~>)
(>*>)
,如果你愿意的话,它符合分布属性:

[[a], [b], [c]] >*> [[d], [e]] == [[a, d], [a, e], [b, d], [b, e], [c, d], [c, e]]
这也适用于
(~>)
,以及
(~~>)
转置表示

然后我想“永远”重复这个乘法运算符``

以下是我的尝试,所有这些都是由于相互依赖(我认为)导致的堆栈溢出或永不终止

例1:

import Data.Maybe(listToMaybe)
import Control.Monad(liftM2)

type A = [[Int]]

a :: A
a = [[1]]

-- Building finite lists of infinite lists:
(~>) :: A -> A -> A
(~>) = liftM2 (++)

forever1 :: A -> A
forever1 p = p ~> forever1 p

forever2 :: A -> A
forever2 p = forever2 p ~> p
例2:

-- Building infinite lists of finite lists:
(~~>) p q = mx q p ++ mx p q
    where innerLen = maybe 0 length . listToMaybe
          mx a = map (concatMap $ replicate $ innerLen a)

forever3 :: A -> A
forever3 p = p ~~> forever3 p

forever4 :: A -> A
forever4 p = forever4 p ~~> p

{-
forever1 p = do
    x <- p
    y <- do
        x' <- p
        y' <- do
            ...
    return $ x ++ y

forever1 p =
    p >>= \x1 -> p >>= \x2 -> p >>= ... >>= \xn -> return concat [x1, x2, ... xn]
-}
这些列表实际上不是由
Int
s组成的,而是由函数
a->a
组成的

我的问题有可能以某种方式解决吗?如果有,如何解决?
还是不可能?

我很难理解你的问题,因为最初的例子是“分布式的”“
*>
的等式,其左手边涉及单例列表的有限列表,而不是无限列表的有限列表,反之亦然。对不起,我的错,应该更具体一些。。。如果您这样做:
forever1[[1]]
,那么它正在使用
~>
构建一个无限列表的有限列表
forever
就像重复,但它是乘性的,所以它变成了一种无限的力量。不管怎样,我现在很确定这在任何情况下都是不可能的,但我没有语言来制定一个适当的正式答案。。。也许是吧<代码>永久1[[1]]将导致堆栈溢出。
u = undefined

type ActionFn a = a -> (Action a, a)
data Action a = None | A { act :: ActionFn a }
newtype Program a = P { actions :: [Action a] }

(>>>) :: Action a -> Action a -> Action a
(>>>) None q = q
(>>>) (A f) g = A $ \a -> let (h, b) = f a in (h >>> g, b)

(>*>) :: Program a -> Program a -> Program a
(>*>) (P ps) (P qs) = P $ zipWith (>>>) (mul qs ps) (mul ps qs)
    where mul other = concatMap (replicate $ length other)

basic :: ActionFn a -> Program a
basic = P . return . A

idle :: Program a
idle = basic $ \a -> (None, a)

forever5 :: Program a -> Program a
forever5 p = p >*> forever5 p

testF5 = map (const "x") $ actions $ forever5 idle