5

0.1から-150までの数字のリストを作りたいです150

これを行うために、リストを作成し、次のように分数乗算ラムダをそれにマップしようとしました。

let indices = [-1500,-1499..1500]
let grid = map (\x -> 0.1 *x) indices

これにより、ghci はエラーを吐き出します。

一方、これらは両方とも正常に機能します。

let a = 0.1*2

let grid = map (\x -> 2 *x) indices

何が起きてる?Num と Fractional の乗算が、マップを含むリストに適用された場合にのみ失敗するのはなぜですか?

編集:私が得るエラーは次のとおりです:

No instance for (Fractional Integer)
  arising from the literal `0.1'
Possible fix: add an instance declaration for (Fractional Integer)
In the first argument of `(*)', namely `0.1'
In the expression: 0.1 * x
In the first argument of `map', namely `(\ x -> 0.1 * x)'
4

4 に答える 4

10

あなたは「恐ろしい単型性制限」を発見しました。基本的に、GHC は の型を のindicesようなモノタイプであると推論し[Integer]ますNum a => a。のような注釈を付けるかindices :: [Float]、定義を作り直して制限を回避することができます。

たとえば (提案ではありません)、indices関数を作成する場合: let indices a = [-1500, -1499..1500]、推論される型は now(Enum t, Num t) => a -> [t]です。このaパラメーターは使用されていませんが、制限は無効になっています。その後、次のことができますmap f (indices whatever)モノモーフィズムの制限に関するHaskell Wiki の詳細を参照してください。

于 2013-04-04T06:05:39.400 に答える
-1

次のコードは私のために働いた

let indices = [-1500,-1499..1500]

let grid = map ( \x -> x /10 ) indices

0.1は好きじゃない

完全な説明については、このリンクのセクション「単形性の問題」を参照してください

于 2013-04-04T06:00:18.563 に答える