2017-03-24 10 views
1
digits :: Int->Int->Int 
digits x y 
    |x`mod`10 == y`mod`10 = count x y 
    |otherwise = digits (x`div`10) (y`div`10) 

count :: Int -> Int -> Int 
k = 0 + 1 
count x y 
    |x < 1 = getprize k 
    |otherwise = digits (x`div`10) (y`div`10) 

getprize :: Int -> Int 
getprize k 
     |k == 8 = 1000000 
     |k == 7 = 100000 
     |k == 6 = 8000 
     |k == 5 = 300  
     |k == 4 = 20 
     |k == 3 = 5 
     |k == 2 = 1 
     |k < 2 = k 
     |otherwise = 43 

私はこのコードをHaskellで書いています。目標は、入力番号x、yの等しい桁数を検索することです。カウンタを設定しようとするとk)getprizeをkで呼び出すことはできません。なぜなら、整数として登録されているからです。カウンタをintに設定すると、何桁の数字が同じであるかを数えることができます。haskellでカウンタを設定してインクリメントする

+5

私は、基本に戻って、他の言語について知っていることをすべて忘れて、haskellを学ぶべきだと思います。この質問は、haskellがどのように動作するかについて、あらゆる点で甚大な混乱を示しています。それは実際にあなたが慣れていたものと実際は異なっています。あなたがここで活用しようとしているパターンは、活発に有害です。 – Carl

+0

あなたは実際には '整数 'にすることを望んでいるのですか、それとも' I​​nt'にしますか? – leftaroundabout

+2

@Carl、それが学習の仕方であれば。どのアイデアを修正する必要があるかを教えてもらいましょう – luqui

答えて

3

(「Haskellでカウンタを設定し、それをインクリメントする」)私はあなたのコードでやろうとしているのか理解言うことはできませんが、私は私があなたのタイトルの質問から生じる根本的な誤解に対処することができると思いますHaskellのすべての値は不変です。つまり、設定後に変更することはできません。 k = 0 + 1と書くと、それは残りの永遠の間、誰かがkを見ると、確かにそれが0 + 1を意味することを確かに知っていることを意味します。もちろん、それは1と等しくなります。このため、関数の繰り返しごとにkの値を変更することはできません。

ここでは、再帰を使用してHaskellで反復をシミュレートする例を示します。この関数は、数値を取り、0にすべての方法ダウンし、その数以下のすべての数字を追加します。

sumLessThan :: Int -> Int 
sumLessThan 0 = 0 
sumLessThan k = k + sumLessThan (k - 1) 

を今、私はsumLessThan 3を評価するならば、我々は、第二の関数定義を使用して参照して3を置き換えることができますksumLessThan 3 = 3 + sumLessThan (3 - 1)になるようにします。我々は続ける場合は、我々は最終的に、実際の結果を見つける:あなたが見ることができるように

sumLessThan 3 
3 + sumLessThan (3 - 1) 
3 + sumLessThan 2 
3 + (2 + sumLessThan (2 - 1)) 
3 + (2 + sumLessThan 1) 
3 + (2 + (1 + sumLessThan 0)) 
3 + (2 + (1 + 0)) 
3 + (2 + 1) 
3 + 3 
6 

、我々はそれに基づいて個別の値を追跡すると、結果を計算していないが、我々は用語で結果を計算しています小さい結果のは、ベースケースに達するまで小さくなり、小さくなります。これは簡単なケースですが、計算が簡単です。私たちのベースケースは、sumLessThan 0 = 0

でした。これは、Haskellで "ループ"を書くときに従う正しいパターンです。別の「反復子」値を使用しないでください。

関連する問題