在Haskell中,如果我想重复将一个内同态a -> a应用于a我可以使用的类型的值iterate.
那个函数不是一个endomorphisms,但通用到足以在返回类型上正常工作?
考虑一下Just :: a -> Maybe a; 我可以写
Just . Just . Just ...
Run Code Online (Sandbox Code Playgroud)
我想要多次.有没有办法用这样的东西写这个
iterate' 3 Just :: a -> Maybe (Maybe (Maybe a))
Run Code Online (Sandbox Code Playgroud)
或者我们需要像依赖类型这样的东西吗?
当我尝试对python中的问题应用更具功能性的方法时,就会出现此问题。我试图做的只是简单地将一个数字列表平方,没什么大不了的。
from operator import pow
from functools import partial
squared = list(map(partial(pow, b=2), range(10))
Run Code Online (Sandbox Code Playgroud)
事实证明,这没有用。 TypeError: pow() takes no keyword arguments
困惑我检查是否pow(b=2, a=3)。没有。
我已经检查了操作员的源代码,没有可疑之处。
感到困惑,我开始怀疑自己的python知识,我自己做了一个pow函数。
def pow(a, b):
return a ** b
Run Code Online (Sandbox Code Playgroud)
然后,我尝试用我的功能做同样的事情,而且令人惊讶的是,一切正常。
我不会猜测问题的原因是什么,我要问的仅仅是原因为何,以及是否存在解决方法。
今天我遇到了一个奇怪的问题.模式匹配没有看到在where子句下定义的函数.
foo (bar -> 1) = 2
where
bar _ = 1
Run Code Online (Sandbox Code Playgroud)
此代码拒绝编译声明变量bar不存在.
当然,这是一个简单的解决方案,但我对这种范围规则背后的推理感兴趣.
假设你声明了两个同构
showing :: (Read a, Show a) => Iso' String a
showing = iso read show
reading :: (Read a, Show a) => Iso' a String
reading = iso show read
Run Code Online (Sandbox Code Playgroud)
它们是不安全的,并不是每个String都会解析为a.
这引出了一个问题:为什么这两个不包含在库enum = iso fromEnum toEnum中?
它同样不安全,不能通过类型系统来防止.他们都把负担转嫁给程序员,程序员必须确保转换不会破坏同构.
快速示例:under enum (+1) True将抛出异常
我在Haskell中有一些使用模式匹配的代码.但是,我认为我可以使用折叠和过滤器.对我来说,这将更具可读性,但我想知道它在复杂性方面有任何优势.
我们是否可以定义构造自上而下而不是自下而上的值的递归方案(而不失去其一般性)?
这将非常有帮助,因为我已经看到很多次使用递归方案在内部定义的功能首先应用于reverse其输入的情况,这清楚地表明需要执行类似foldl的“从前到后”执行。