3

我正在寻找一种在 Miranda 中执行 while 循环或 for 循环的方法。

我正在尝试做类似的事情

while(blablanotfinished)
{
if(a=true)blabla
else blabla
}
4

4 回答 4

3

Miranda 没有 while 或 for 循环(无论如何,如果没有可变状态,这将没有多大意义)。在大多数情况下,您可以改用高阶函数。如果没有高阶函数可以满足您的需要,您可以使用递归。

例如,如果您在命令式语言中有以下 while 循环:

f(start) {
    x = start
    while( !finished(x) ) {
        x = next(x)  
    }
    return x
}

您可以像这样在 Miranda 中递归地表达它:

f x = if finished x then x else f (next x)
于 2011-10-08T16:05:41.827 回答
1

在 Miranda 中(一般来说,在纯函数式编程语言中)不鼓励使用 WHILE、FOR 等循环结构。您应该通过递归进行迭代。

于 2011-10-08T15:56:00.547 回答
1

与许多其他函数式语言一样,Miranda 没有 for 或 while 循环。相反,您使用递归、列表推导高阶函数编写循环。

于 2011-10-08T16:00:18.997 回答
1

函数式编程风格的 while/repeat/for-loops 如下所示:


while :: (*->bool) -> (*->*) -> * -> *
while p ff state
  = state                , if ~ (p state)
  = while p ff (ff state), otherwise

示例:将数字添加到它的反面,直到它是一个回文。提示:起始值 196 会导致非常大的数字。


isPalindrome :: num -> bool
isPalindrome n = (str = reverse str) where str = shownum n

addPalindrome :: num -> num
addPalindrome n = n + rev where rev = (numval.reverse.shownum) n

test196 :: num -> num
test196 n = while ((~).isPalindrome) addPalindrome n

test = test196 89

我希望,仍然有人对 Gofer/Miranda/Haskell 感兴趣。

安妮玛丽·佩森(德国)

于 2021-01-01T21:32:20.297 回答