相关疑难解决方法(0)

类型(c→d)→(a→b→c)→(a→b→d)的Haskell函数组合算子

普通的功能组成属于这种类型

(.) :: (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 pointfree function-composition

39
推荐指数
5
解决办法
9075
查看次数

库函数用n次组成一个函数

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

37
推荐指数
6
解决办法
1万
查看次数

Haskell:重复一个函数很多次而没有stackoverflow

作为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.

stack-overflow haskell

11
推荐指数
1
解决办法
3564
查看次数

在Haskell中多次应用函数

向大家学习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中编写重复应用程序的功能?请发布任何可能的解决方案,使用递归,高阶函数或其他任何东西.

haskell higher-order-functions

0
推荐指数
1
解决办法
4281
查看次数