2017-11-13 18 views
3

は、私が問題に遭遇している一緒にHaskellは実際の型と予想されるfloat型が一致しませんでした「」タプルの2部を追加しようとすると

機能タイプ:

close :: (Floating a, Ord a) => (a,a) -> (a,a) -> Float 

関数の定義:フォーマットの機能AYタプル(、)およびフォーマットの斧タプルを供給するオン

close y x = sqrt (((fromIntegral(snd x) - fromIntegral(snd y))^2) + ((fromIntegral(fst x) - fromIntegral(fst y)^2))) 

(、)は、2つの座標間の距離を計算する必要があります。 は、しかし、起動時に、私はのエラーを取得する:

Couldn't match expected type 'Float' with actual type 'a' 
a is a rigid type variable bound by... 

私は、問題が生じている理由を理解して、私はあなたがこれをデバッグするのに役立つ

+2

あなたは型定義で 'フローティングA'に言及して、競合である' Integral'型クラスに属することになっているのと同じ 'A'タイプ...と機能に' fromIntegral'を養います。 – Redu

+0

結果を生成するには、 'Floating a => a - > Float'関数が必要です。私は 'close :: Floating a =>(a、a) - >(a、a) - > a'、または' close ::(Integral a、Floating b)=>(a、a) a、a)→b 'である。 'Ord'と' Float'はどこから来たのですか? – molbdnilo

+0

@molbdnilo多分彼は出力から具体的な 'Float'を望んでいますか? –

答えて

2

タイプが間違っています。 Reduがコメントに言及しているように、型式はFloatingであり、その上にfromIntegralが呼び出されています。

Prelude> :t fromIntegral 
fromIntegral :: (Num b, Integral a) => a -> b 

あなたはFloatingIntegralを持つことができないので、これは失敗します。あなたのタイプではなく、次のようになります。あなたも(^)(Num a, Integral b) => a -> b -> a上で動作するので、任意の数をベースとすることができ、できるだけ多くfromIntegral呼び出しを必要としない

close :: Integral a => (a, a) -> (a, a) -> Float 

注意。重要な操作はsqrtで、これにはFloating aが必要です。

close :: Integral a => (a, a) -> (a, a) -> Float 
close (x1, y1) (x2, y2) = sqrt . fromIntegral $ squaredDistance where 
    squaredDistance = (x1 - x2)^2 + (y1 - y2)^2 
0

一つの技術は、コメントをするだろう、それを修正する方法が分かりませんあなたのタイプシグネチャを取り出し、そのタイプが何であるかをシステムに尋ねます。 ghciでは、それは:t closeになります。

+0

私には 'Floating a =>(a、a) - > a、a) - > a ' –

+0

これは基本的に自分のタイプとして持っていたものです –

+0

@MaxUmarovs 'close'の定義にはその型はありませんが、' Floating a1、Integral b、Integral b1、Integral a、Integral a2 )=>(a2、b1) - >(a、b) - > a1'である。 – molbdnilo

関連する問題