普通的功能组成属于这种类型
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
我认为这应该概括为类型:
(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
Run Code Online (Sandbox Code Playgroud)
一个具体的例子:计算差分平方.我们可以写diffsq a b = (a - b) ^ 2,但感觉我应该能够编写(-)和(^2)编写类似的东西diffsq = (^2) . (-).
当然,我不能.我可以做的一件事是使用一个元组而不是两个参数(-),通过转换它uncurry,但这不一样.
有可能做我想要的吗?如果没有,我误解的是什么让我认为它应该是可能的?
注意:这里已经有效地提出过这个问题,但是没有给出答案(我怀疑必须存在).
Haskell中是否有一个库函数可以自己编写一个函数n次?
例如,我有这个功能:
func :: a -> a
Run Code Online (Sandbox Code Playgroud)
我想这样做:
func . func . func . func . func . func , ...
Run Code Online (Sandbox Code Playgroud)
(最多n次,其中n仅在运行时已知).
请注意,迭代函数不适合我正在做的事情,因为我不关心任何中间结果.
作为Haskell的新手,我试图多次迭代一个函数(例如,逻辑映射).在命令式语言中,这将是一个简单的循环,但在Haskell中,我最终会出现堆栈溢出.以此代码为例:
main = print $ iter 1000000
f x = 4.0*x*(1.0-x)
iter :: Int -> Double
iter 0 = 0.3
iter n = f $ iter (n-1)
Run Code Online (Sandbox Code Playgroud)
对于少量迭代,代码可以工作,但是对于一百万次迭代,我得到了堆栈空间溢出:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.这里的尾递归应该没问题.也许问题是懒惰的评价.我尝试了几种方法来强制进行严格的评估,通过插入$!或seq在不同的位置,但没有成功.
什么是Haskell迭代函数很多次的方法?
我已经尝试过相关帖子的建议:这里或这里,但我总是以堆栈流程结束大量的迭代,例如main = print $ iterate f 0.3 !! 1000000.
向大家学习Haskell("高阶函数"一节,"有些高阶有序"这一小节)描述了一个函数applyTwice,它在一个参数上调用两次函数:
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)
但是我需要一个函数,它可以在某个参数上应用某些函数任意次数.例如applyN 3 f x,相当于f $ f $ f x.我如何在Haskell中编写重复应用程序的功能?请发布任何可能的解决方案,使用递归,高阶函数或其他任何东西.