2017-01-24 17 views
1
import Data.List 

s = "123456789" 

fibs = 1 : scanl (+) 1 fibs 
res (x:xs) = if (sort. show $ div x (10^(floor(m) - 8))) == s then x else res  xs 
where m = logBase 10 x 

コードは、フィックスナンバーの最初の9桁をピックし、それらが変数sと一致するかどうかを確認します。私はさまざまな分野でIntegralから挿入することでこれを修正しようとしましたが、特にエラーの原因が関数 'res'を参照するため、動作させるようには見えません。正しい方向に私を指差してください。'res'を使用して(Floating Integer)のインスタンスがありません

私が手にエラーがある:それは、このようにFloatingIntegralRealFracShowあるタイプが必要です

res :: (Floating r, Integral r, RealFrac r, Show r) => [r] -> r 

resが型を持っているので、あなたが直接res fibを呼び出すことはできません

No instance for (Floating Integer) arising from a use of ‘res’ 
In the expression: res fibs 
In an equation for ‘it’: it = res fibs 
+0

コンパイルエラーも印刷してください。 –

+0

コンパイラエラー: – Amateur

+0

'res'を使用しているためにインスタンスがありません(浮動整数) 式中:式の中で:it = res fibs – Amateur

答えて

2

これで、タイプには非常に問題のある関数を構築したように見えます。タイプはFloatingIntegralの両方であると予想します。あなたはしかしにあなたの関数を書き換えることができます

:私は今res fibを実行すると

res :: (Integral a, Show a) => [a] -> a 

、それが与える:

*Main> res fibs 
*** Exception: Negative exponent 

論理的である今

res (x:xs) | s == sort (show (div x (10^(m - 8)))) = x 
      | otherwise = res xs 
      where m = floor $ logBase 10 $ fromIntegral x 

resは種類があります負の指数(10^(m-8))を入力しているためです。私は今、それも結局、プログラムが計算しているようだ(と妥当な時間で解決策を見つけることができませんres fibsを実行した場合

res (x:xs) | m >= 8 && s == sort (show (div x (10^(m - 8)))) = x 
      | otherwise = res xs 
      where m = floor $ logBase 10 $ fromIntegral x 

:私の推測では、あなたがそれを書き換えるように、あなたは、単に、これらのケースを省略したいということですすべての利用可能なメモリを食べる)。

ただし、すべての桁が存在するかどうかを調べる場合は、ソートでは重複を除外しないため、単純にsortを使用することはできません。

+0

詳細な説明はウィレムに感謝します。これは非常に役に立ちます。 – Amateur

関連する問題