Haskell型の強制に頭を包み込もうとしています。つまり、キャストせずに関数に値を渡すことができるのはいつですか、それがどのように機能するかです。これが具体的な例ですが、何が起こっているのかを理解するために、今後使用できるより一般的な説明を探しています。
Prelude> 3 * 20 / 4
15.0
Prelude> let c = 20
Prelude> :t c
c :: Integer
Prelude> 3 * c / 4
<interactive>:94:7:
No instance for (Fractional Integer)
arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: 3 * c / 4
In an equation for `it': it = 3 * c / 4
(/)のタイプは分数a => a->a->aです。ですから、リテラルを使って「3 * 20」を行うと、Haskellはどういうわけかその式の結果が分数であると想定していると思います。ただし、変数を使用する場合、その型は割り当てに基づいて整数になるように事前定義されています。
私の最初の質問は、これを修正する方法です。式をキャストする必要がありますか、それとも何らかの方法で変換する必要がありますか?私の2番目の質問は、これは私には本当に奇妙に思えるので、int/float型についてそれほど心配する必要なしに基本的な数学を行うことはできません。これらの間で自動的に変換する明白な方法があるということですが、なぜ私はこれについて考えて対処する必要があるのですか?私はそもそも何か間違ったことをしていますか?
私は基本的に、細かい部分を気にせず、コードをきれいに保つことなく、簡単な算術式を簡単に記述できる方法を探しています。ほとんどのトップレベル言語では、コンパイラは私のために機能します-その逆ではありません。