Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的迭代计算_Haskell - Fatal编程技术网

Haskell中的迭代计算

Haskell中的迭代计算,haskell,Haskell,我是Haskell的初学者,我试图在Haskell中创建一个无限列表,其中下一个术语可以通过以下公式找到 xn+1 = (xn + const / xn) div 2. 我一直在研究iterate命令,因为我想再次应用相同的函数来生成下一个答案 然后我将使用take从列表中选择一定数量的元素 但是,我不确定在使用iterate时如何表示xn 我开始写take 10(iterate(xn+5/xn div 2)1),我知道我需要替换xn,但不确定用什么替换 谁能给我个建议吗?只要使用lambda

我是Haskell的初学者,我试图在Haskell中创建一个无限列表,其中下一个术语可以通过以下公式找到

xn+1 = (xn + const / xn) div 2.
我一直在研究iterate命令,因为我想再次应用相同的函数来生成下一个答案

然后我将使用take从列表中选择一定数量的元素

但是,我不确定在使用iterate时如何表示xn

我开始写
take 10(iterate(xn+5/xn div 2)1)
,我知道我需要替换xn,但不确定用什么替换


谁能给我个建议吗?

只要使用
lambda
功能:

mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)

这里有一个

只需使用一个
lambda
函数:

mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)

这里有一个

您基本上描述了一个函数:

mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)
使用
c
时,
const
const
是前奏曲中的一个函数,因此不要使用该名称)。或者作为lambda表达式:

\xn -> (xn + c) / (2*xn)
c
你的常数。现在我们可以在
迭代中插入它:

take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
使用
c=5
,我们得到:

Prelude> take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
[1.0,3.0,1.3333333333333333,2.375,1.5526315789473684,2.110169491525424,1.684738955823293,1.9839094159713946,1.7601381796335236,1.9203430326819695]
如果要计算整数的值,可以使用:

\xn -> div (xn + c) (2*xn)
这将产生:

Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]
如果要在计算后对结果进行四舍五入,可以使用
floor

\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))
这将产生:

Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]

您基本上描述了一个函数:

mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)
使用
c
时,
const
const
是前奏曲中的一个函数,因此不要使用该名称)。或者作为lambda表达式:

\xn -> (xn + c) / (2*xn)
c
你的常数。现在我们可以在
迭代中插入它:

take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
使用
c=5
,我们得到:

Prelude> take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
[1.0,3.0,1.3333333333333333,2.375,1.5526315789473684,2.110169491525424,1.684738955823293,1.9839094159713946,1.7601381796335236,1.9203430326819695]
如果要计算整数的值,可以使用:

\xn -> div (xn + c) (2*xn)
这将产生:

Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]
如果要在计算后对结果进行四舍五入,可以使用
floor

\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))
这将产生:

Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]

它是
div(xn+const/xn)2
div
不是运算符,所以您不能使用它的中缀(没有backtics),我在这里删除了它们,因为当我这样做时,它将div从代码列表中删除。@JamesHamish您必须在引号前面加一个反斜杠来逃避引号:
`div`
通过在引号周围加两个反斜杠来引用包含代码的反斜杠。它是
div(xn+const/xn)2
div
不是运算符,所以您不能使用它的中缀(没有backtics),我在这里删除了它们,因为当我这样做时,它从代码列表中删除了div。@JamesHamish您必须在引号前面加一个反斜杠来逃避引号:
`div`
通过在引号周围加上双反斜杠来引用包含代码的反斜杠。问题是我使用div进行整数除法和舍入,分割后,您正在使用/您不能同时使用
div
/
并获得相同的类型,因为
(/)::分数f=>f->f->f
div::Integral i=>i->i
。虽然从技术上讲我们可以构造这样一个类型,但是让一个类型同时检查括号是否是您想要的,这是非常奇怪的。浮点数比整数更有意义。问题是我使用div进行整数除法和舍入,当你除法后,你就使用了/你不能同时使用div和
/
并获得相同的类型,因为
(/)::分数f=>f->f->f
div::Integral i=>i->i->i
。虽然从技术上讲我们可以构造这样一个类型,但是让一个类型同时检查括号是否是您想要的,这是非常奇怪的。浮点数比整数更有意义。