问题主要在标题中。似乎可以为任何一元计算定义mfix,尽管它可能会发散:
mfix :: (a -> m a) -> m a
mfix f = fix (join . liftM f)
这个建筑有什么问题?另外,为什么Monad和MonadFix类型是分开的(即哪种类型有Monad的实例,而没有MonadFix的实例)?
让我们: {-# LANGUAGE RecursiveDo #-}
test :: [a] -> Maybe Int
test [] = Just 0
test (_ : xs) = mdo
unless (i == 0) Nothing -- 1
i <- test xs -- 2
Just i 我正在寻找一种解释,比如为什么调用test "hey"会导致无限循环,以及在处理mfix时通常如何避免这种行为。另外,有没有一种方法可以在不交换(1)和(2)的顺序的情况下纠正前面的玩具示例?
我最近偶然发现了loeb和moeb函数,我正在尝试探索它能做什么。
我试图实现类似电子表格的行为,有可能在一些“单元格”中执行IO。我在想,moeb traverse似乎是个不错的候选人,但任何不平凡的(比如.除了const $ return something)函数之外,我使用的列表中的函数将导致整个调用永远运行。在此之后,我尝试在State monad中测试它:
moeb f x = fix $ \g -> f ($g) x
foo v = do
x <- get
vs <- v
put (x + 3)
return (x + (vs!!
我试图在mfix中运行测试问题,但是遇到了一个错误sh: 0: Can't open ../../model/make_mfix。
bhaskar@admin2-Precision-T7600:~/mfix/run/tests/Added_Mass$ sh ../../model/make_mfix
sh: 0: Can't open ../../model/make_mfix
有人能说出它为什么会发生以及如何摆脱它吗。
由于Nothing >>= f = Nothing对每个f都适用,下面的简单定义适用于mfix
mfix _ = Nothing
但这没有实际用途,因此我们有以下非全面的定义:
mfix f = let a = f (unJust a) in a where
unJust (Just x) = x
unJust Nothing = errorWithoutStackTrace "mfix Maybe: Nothing"
如果mfix f返回Nothing,如果let-clause不停止的话,那就太好了。(例如,f = Just . (1+))
这是
我的脚本在Python3上遇到了递归循环,我尝试用items替换iteritems,但没有解决这个问题,Python2运行得很好。__getattribute__有没有什么我不知道的变化?
class Map(object):
def __init__(self, *args, **kwargs):
for arg in args:
if isinstance(arg, dict):
for k, v in arg.items():
self.__dict__[k]
我将从它的当前值更新行为(Cell / Val)。
但是,下面的代码会在操作异常中抛出一个无限期阻塞的线程。
我预期它会打印三次“i:的值”。我错过了什么?-谢谢。
{-# LANGUAGE RecursiveDo #-}
module Main where
import FRP.Sodium
main :: IO ()
main = do
(e, t) <- sync newEvent
rec
b <- sync $ hold 0 $ snapshot (\_ i -> i + 1) e b
我将无限递归函数定义为:
>>>def f():
>>> f()
>>>
然后我给这个函数打了电话,结果发生了这样的事情:
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
File "<stdin>", line 2, in f
File "<s
看看下面的递归BNF规则
(1) X = Xa | b
这会产生如下语句
X = b
X = ba
X = baa
X = baaa
...
这可以写成
(2) X = b a*
其中右侧不是递归的
现在看一下下面的递归BNF规则
(3) X = { X } | b
这会产生如下语句
X = b
X = {b}
X = {{b}}
X = {{{b}}}
...
有没有办法以非递归的方式重写规则(3),就像我们将规则(1)重写为规则(2)时所做的那样。
注意到X= {* b }*不好,因为括号需要对齐。
给定的
newtype Tree m a = Tree { runTree :: m (Node m a) }
data Node m a = Node
{ nodeValue :: a
, nodeChildren :: [Tree m a]
}
是否有一个有效的MonadFix实例?
我的尝试是
instance MonadFix m => MonadFix (Tree m) where
mfix f = Tree $ do
Node
<$> mfix (runTree . f . nodeValue)
<*>
我有一个由FreeT生成的标准解释器monad转换器的简化版本
data InteractiveF p r a = Interact p (r -> a)
type Interactive p r = FreeT (InteractiveF p r)
p是“提示符”,而r是“环境”...one使用如下方式运行:
runInteractive :: Monad m => (p -> m r) -> Interactive p r m a -> m a
runInteractive prompt iact = do
ran <- runFreeT iact
我有一个非常基本的疑问。请考虑以下示例:
案例1:
a=[1,2,3]
b=[4,5,6]
a.append(b) #print a will give [1,2,3,4,5,6]
案例2:
a=[1,2,3]
a.append(a) # print a gives [1,2,3,...]
我理解python中的.append将变量的值附加到它所附加的变量的末尾。但是,我不理解“.”在第2种情况下的行为。
下面给出了一个函数,用于返回其参数的大小总和,该参数可以是单个文件/目录或文件/目录列表。代码给出了一个错误消息RuntimeError: maximum recursion depth exceeded while calling a Python object,但是我尝试测试它。
如何解决这个问题?
谢谢
suresh
#!/usr/bin/python3.1
import os
def fileSizes(f):
if hasattr(f,'__iter__'):
return sum(filter(fileSizes,f))
if os
我刚刚在haskell-cafe上问了这个问题,但我想我也可以在这里问一下。以下的Monad实例是否有效?
{-# Language RecursiveDo #-}
import Control.Applicative.Backwards
import Control.Monad.Fix
instance MonadFix m => Monad (Backwards m) where
m >>= f = Backwards $
do
fin <- forwards (f int)
int <- forwards m
大家好,我做了一个递归阶乘来比较它和一个普通的,问题是它只达到数字5,在那里它就被破坏了。
错误: RecursionError:调用对象时超过了最大递归深度
import time
def factorial(n):
res=1
while n>1:
res*=n
n-=1
return res
def factorial_r(n):
print(n)
if n==1:
return 1
return n*factorial_r(n-1)
if __name__=="__mai
在下面的代码中,我想找出2个多项式的最大公约数。有时我会收到“return c.plus( (a.minus(b.times(c)).divides(b) ) ;”的错误提示。我怎么才能修复它?
public Polynomial divides(Polynomial b) {
Polynomial a = this;
if ((b.deg == 0) && (b.coef[0] == 0))
throw new RuntimeException("Divide by zero polynomial");
我正在尝试构建一个递归查询,并且我面临着一个问题。
请在我的数据集下面找到
WITH table1 ( ID, Code, Label ) as(
SELECT 123, 'C1', 'LABEL_1' from dual UNION ALL
SELECT 1, 'C2', 'LABEL_2' from dual UNION ALL
SELECT 30, 'C3', 'LABEL_3' from dual UNION ALL
SELECT 44, 'C4', '
有没有人能解释为什么这两个代码都能很好地编译:
data A a b = A { a :: a, b :: b }
newtype B a = B (A a (B a))
newtype C = C (A Int C)
但是我不能通过类型同义词创建类似的递归定义的类型?
type B a = A a (B a)
type C = A Int C
尽管很明显data B a = A { a :: a, b :: B a }运行得很好。
有没有办法避免在我想要类型递归的地方处理额外的构造函数X?无论如何,我主要是在传递挑选b的访问器函数,所以我基本上没问题,但是如果有一种简单的规避机制,我想知道它
对于这个查询,我一直得到一个max recursion error。
起初,我认为这是因为返回了一个空值,然后它会尝试匹配导致错误的空值。然而,我重写了我的查询,这样就不会返回空值,错误仍然会发生。
重写此函数的最佳方式是什么,这样就不会出现错误
WITH EmployeeTree AS
(
SELECT
EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid,
CASE Employees.APV_MGR_EMP_ID
WHEN Null THEN '0'
E