ミランダでwhileループまたはforループを実行する方法を探しています。
私は次のようなことをしようとしています
while(blablanotfinished)
{
if(a=true)blabla
else blabla
}
ミランダでwhileループまたはforループを実行する方法を探しています。
私は次のようなことをしようとしています
while(blablanotfinished)
{
if(a=true)blabla
else blabla
}
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)
ミランダ(および一般に、純粋に関数型プログラミング言語)では、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
誰かがまだGofer/Miranda/Haskellに興味を持っていることを願っています。
Annemarie Paysen(ドイツ)