当我们在解释器中输入以下内容时:
10(b)
Run Code Online (Sandbox Code Playgroud)
我们得到一个未定义 b 的 NameError。但是,当我们尝试:
10(4)
Run Code Online (Sandbox Code Playgroud)
现在,我们得到了 int 不可调用的错误信息。为什么 Python 在上面的第一种情况下没有给出相同的错误,因为即使在那里, int 也是不可调用的?换句话说,在第一个片段中,我们有“int not callable”和“NameError”这两个错误。如果 Python 从左到右扫描,它首先会看到对 int (10) 执行的调用操作。所以它也应该为第一个给出“int not callable”错误。为什么没有?
我认为这可能是因为它首先评估括号内的表达式。但是,当我们尝试这样做时:
f(print("Hello"))
Run Code Online (Sandbox Code Playgroud)
现在,它说 NameError 没有定义 f。它甚至不打印“你好”。所以这表明我们对带括号的表达式求值的假设似乎不成立。
那么它究竟是如何工作的呢?
我知道它们都是不同的语言,但它们两者基本上不一样吗?fmap在Functor上应用函数,而Python的map在iterable上应用函数.因此,如果两者之间存在任何差异,您能提供一些我们可以用Python的地图而不是Haskell的fmap(反之亦然)的例子吗?
特别是,我的问题是如何认为这与f本身相同?
我们知道,类型return是:: a -> m a和类型>=>是:: (a -> m b) -> (b -> m c) -> (a -> m c)所以,当我们申请>=>到return和f,不会有成为一个类型不匹配,因为不会有我们(a -> m a) -> (b -> m c)的类型return分别楼这意味着如何我们>=>现在申请?
我们知道do块只是语法糖.但是,它如何确定它所处的monadic背景?假设我们不在<-do块中的任何地方使用运算符.
例如,如果我想转换:\ x - > x + 100,我如何用无点表示法编写?\ - > id + 100似乎不起作用
我们知道$运算符绑定最松散,并且也关联到右边,这意味着,[1 ..]应该首先进行评估,因此,它不应该遇到无限循环?为什么它甚至停止了?