Миранда в то время как и для петли
Я ищу способ делать пока-петли или петли-в Миранде.
Я пытаюсь сделать что-то вроде
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
Надеюсь, кому-то еще интересны Гофер/Миранда/Хаскелл.
Аннемари Пайсен (Германия)