2016-09-12 13 views
-1

私は関数を書いていますが、適切な解決策を見つけることができません。私はこの方法を修正することができます。'it'の使用に起因する(分数a0)のインスタンスがありません

findLoot val [] = 0 
findLoot val ((x:y:[]):xs) | val == 0 = 0.0 
          | val < y = ((val*x)/y) 
          | val > y = ((div val y)*x) + (findLoot (mod val y) xs) 

エラーを

interactive:33:1: 
    No instance for (Fractional a0) arising from a use of ‘it’ 
    The type variable ‘a0’ is ambiguous 
    Note: there are several potential instances: 
     instance HasResolution a => Fractional (Fixed a) 
     -- Defined in ‘Data.Fixed’ 
     instance Integral a => Fractional (Ratio a) 
     -- Defined in ‘GHC.Real’ 
     instance Fractional Double -- Defined in ‘GHC.Float’ 
     ...plus one other 
    In the first argument of ‘print’, namely ‘it’ 
    In a stmt of an interactive GHCi command: print it 

入力セットが

Input 1:- 
    val = 50 
    ((x:y:[]):xs) = [[120, 30], [100,50],[60, 20]] 
Output 1:- 
    180.0000 

Input 2:- 
val = 10 
((x:y:[]):xs) = [[500,30]] 
Output 2:- 
166.6667 
+0

あなたの数字のタイプを判断しようとしますが、決めることはできません。 – Bergi

+0

@Bergiはこれを修正する方法がありますか?私は適切な解決策を考えることができません。 –

+0

明示的な型を追加する 'findLoot :: Fractional a => a - > [a] - > a' – Bergi

答えて

3

あるという問題がHaskellは、同じタイプの値に算術演算を行うことができるということです。 x + yまたはx * yまたはx == yを実行する場合、xyは同じタイプでなければなりません。

第2の問題は、ハスケルの数値型が(主に)積分と小数の2つのクラスに分類されることです。整数型(Integerなど)のみがdivおよびmodをサポートし、小数タイプ(Doubleなど)は/をサポートします。

あなたのコードはHaskellは小数と整数の両方でシングルタイプを探すために強制的に、divmod、およびx/y、およびvalを使用しようとします。そのようなタイプは存在しません。 divmod作業を行いInteger S、ここで

findLoot :: Integer -> [[Integer]] -> Double 
findLoot val [] = 0 
findLoot val ((x:y:[]):xs) | val == 0 = 0.0 
          | val < y = fromIntegral (val * x)/fromIntegral y 
          | val > y = fromIntegral (div val y * x) + findLoot (mod val y) xs 

すべての入力(valxy)され、その結果がDouble次のとおりです。

はここで可能なソリューションです。分数が必要な場合は(/の場合は、再帰的なfindLootコールの結果に加算する場合)、を使用してIntegerからDoubleに変換します。

+0

明示的に型を宣言すると、コンパイラはより有益なエラーを出すことに注意してください。良い練習が報われます。 – Myridium

関連する問題