Miranda while-and-loops

时间:2011-10-08 15:49:01

标签: functional-programming miranda

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

我正在尝试做类似

的事情
while(blablanotfinished)
{
if(a=true)blabla
else blabla
}

4 个答案:

答案 0 :(得分:3)

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

例如,如果您使用命令式语言进行以下while循环:

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

你会在米兰达递归地表达出来:

f x = if finished x then x else f (next x)

答案 1 :(得分:2)

在Miranda中(通常,在纯函数式编程语言中)不鼓励使用诸如WHILE,FOR等循环结构。你期望通过递归进行迭代。

答案 2 :(得分:2)

与许多其他功能语言一样,Miranda没有for-或while循环。相反,您使用递归list comprehensionshigher-order functions来编写循环。

答案 3 :(得分:1)

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


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 感兴趣。

Annemarie Paysen(德国)