我想知道是否有一条快捷方式可以在Python列表中列出一个简单的列表.
我可以在for循环中做到这一点,但也许有一些很酷的"单行"?我用reduce尝试了,但是我收到了一个错误.
码
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
Run Code Online (Sandbox Code Playgroud)
错误信息
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud) 就OOP程序员所理解的而言(没有任何函数编程背景),monad是什么?
它解决了什么问题,它使用的最常见的地方是什么?
编辑:
为了澄清我一直在寻找的理解,让我们假设您正在将具有monad的FP应用程序转换为OOP应用程序.你会怎么做把monad的职责移植到OOP应用程序?
这些天有很多关于单子的讨论.我已经阅读了一些文章/博客文章,但我不能用他们的例子来完全掌握这个概念.原因是monad是一个函数式语言概念,因此这些例子都是我没有使用过的语言(因为我没有深入使用过函数式语言).我无法深入掌握语法以完全遵循这些文章......但我可以告诉它有一些值得理解的东西.
但是,我非常了解C#,包括lambda表达式和其他功能特性.我知道C#只有一部分功能特性,所以monad不能用C#表示.
但是,肯定有可能传达这个概念吗?至少我希望如此.也许您可以将C#示例作为基础,然后描述C#开发人员希望他可以从那里做什么,但不能,因为该语言缺乏函数式编程功能.这太棒了,因为它会传达monad的意图和好处.所以这就是我的问题:你可以给一个C#3开发人员提供monad的最佳解释是什么?
谢谢!
(编辑:顺便说一下,我知道SO上至少有3个"什么是monad"问题.然而,我遇到了同样的问题......所以这个问题需要imo,因为C#-developer焦点.谢谢.)
可能重复:
什么是monad?
我想我明白'也许莫纳德'是什么,但我不确定其他类型.
可能重复:
什么是monad?
您如何用非编程术语描述monad?是否有一些概念/事物在编程之外(在所有编程之外,而不仅仅是FP),可以说是以一种重要的方式行事或像monad一样?
我现在正在阅读Graham Hutton编写的Haskell编程.
在第40页,提出了玩具素性测试:
factors :: Int -> [Int]
factors n = [x | x <- [1..n], n `mod` x == 0]
prime :: Int -> Bool
prime n = factors n == [1,n]
Run Code Online (Sandbox Code Playgroud)
然后,作者继续解释如何
"确定一个数字不是素数不需要函数素数来产生它的所有因子,因为在惰性求值下
False,只要产生一个或多个数字本身以外的任何因子,就会返回结果"
作为来自C和Java的人,我发现这令人震惊.我希望factors调用首先完成,将结果保存在堆栈中并将控制传递给调用函数.但显然这里正在执行一个非常不同的程序:列表理解必须有一个循环,factors并且prime正在检查添加到因子列表中的每个新元素的相等性检查.
这怎么可能?这对于程序的执行顺序是否更难以推理?
我目前正在学习一点点哈斯克尔并开始弄清楚monad是如何工作的.由于我正常编写C++代码,我认为monad模式(就像我现在理解的那样)在C++中也非常棒,例如对于期货等,
我想知道是否有一种方法可以实现一个接口或一个基类来强制执行函数的正确重载bind和return(对于C++的返回而不是返回C++的原因)派生类型?
为了更清楚我在想什么:
考虑我们有以下非成员函数:
auto foo(const int x) const -> std::string;
Run Code Online (Sandbox Code Playgroud)
和一个成员函数bar,它对不同的类有不同的重载:
auto bar() const -> const *Monad<int>;
Run Code Online (Sandbox Code Playgroud)
如果我们现在想做这样的事情:foo(someMember.bar())这根本不起作用.因此,如果必须知道哪个bar返回,例如,如果它返回a future<int>,我们必须调用bar().get(),哪些块,即使我们不需要在这里阻止.
在haskell我们可以做类似的事情 bar >>= foo
所以我问自己是否可以在C++中实现这样的行为,因为在调用时foo(x)我们不关心x是否是一个盒子的对象int,以及盒子里的类int,我们只想foo在盒装类型上应用函数.
对不起,我有一些问题用英语表达我的想法,因为我不是母语人士.
所以我正在努力教自己Haskell.我目前正在第11章" 了解你是一个好的Haskell",我正在做99个Haskell问题以及项目Euler问题.
事情进展顺利,但每当我需要跟踪"变量"时,我发现自己经常做一些事情.我只是创建另一个函数,接受那些"变量"作为参数,并根据情况递归地提供不同的值.举一个例子来说明,这是我对项目Euler的问题7的解决方案,找到第10001个素数:
answer :: Integer
answer = nthPrime 10001
nthPrime :: Integer -> Integer
nthPrime n
| n < 1 = -1
| otherwise = nthPrime' n 1 2 []
nthPrime' :: Integer -> Integer -> Integer -> [Integer] -> Integer
nthPrime' n currentIndex possiblePrime previousPrimes
| isFactorOfAnyInThisList possiblePrime previousPrimes = nthPrime' n currentIndex theNextPossiblePrime previousPrimes
| otherwise =
if currentIndex == n
then possiblePrime
else nthPrime' n currentIndexPlusOne theNextPossiblePrime …Run Code Online (Sandbox Code Playgroud) 我很有诱惑力使用未经检查的异常作为Java程序中的短路控制流构造.我希望有人能以更好,更清洁的方式告诉我这个问题.
我的想法是,我希望减少访问者对子树的递归探索,而不必在每个方法调用中检查"停止"标志.具体来说,我正在使用抽象语法树上的访问者构建控制流图.returnAST中的语句应该停止对子树的探索,并将访问者发送回最近的封闭if/then或循环块.
的Visitor超类(从XTC库)定义
Object dispatch(Node n)
Run Code Online (Sandbox Code Playgroud)
通过表单的反射方法回调
Object visitNodeSubtype(Node n)
Run Code Online (Sandbox Code Playgroud)
dispatch 没有声明抛出任何异常,所以我声明了一个扩展的私有类 RuntimeException
private static class ReturnException extends RuntimeException {
}
Run Code Online (Sandbox Code Playgroud)
现在,return语句的visitor方法看起来像
Object visitReturnStatement(Node n) {
// handle return value assignment...
// add flow edge to exit node...
throw new ReturnException();
}
Run Code Online (Sandbox Code Playgroud)
并且每个复合语句都需要处理 ReturnException
Object visitIfElseStatement(Node n) {
Node test = n.getChild(0);
Node ifPart = n.getChild(1);
Node elsePart = n.getChild(2);
// add flow edges to if/else...
try{ dispatch(ifPart); } catch( ReturnException e ) { …Run Code Online (Sandbox Code Playgroud)