Миранда в то время как и для петли

Я ищу способ делать пока-петли или петли-в Миранде.

Я пытаюсь сделать что-то вроде

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

4 ответа

Решение

У Миранды нет циклов 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)

Как и многие другие функциональные языки, у Miranda нет циклов for или while. Вместо этого вы пишете циклы, используя рекурсию, списки или функции более высокого порядка.

В Миранде (и вообще в чисто функциональных языках программирования) использование циклических конструкций, таких как WHILE, FOR и т. Д., Не рекомендуется. Ожидается, что вы будете выполнять итерацию с помощью рекурсии.

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

Надеюсь, кому-то еще интересны Гофер/Миранда/Хаскелл.

Аннемари Пайсен (Германия)

Другие вопросы по тегам