2017-03-17 11 views
1

関数の宣言を変更せずに、2つの点の間の距離について、予想される型 'b'と実際の型 'a'を一致させることができません。 'a'は、 以下のための署名:」2点距離、関数宣言を変更せずにハスケル?

type Point a = (a,a) 
distance :: (Real a, Floating b) => Point a -> Point a -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = x2 - x1 
    dy = y2 - y1 
+0

あなたは 'sqrt'の結果に' realToFrac'を適用しようとしている使用することはできませんなぜ特定の理由はありますか? – jakubdaniel

答えて

2

sqrtは、その引数と同じ型を返します。

Prelude> :t sqrt 
sqrt :: Floating a => a -> a 

あなたはsqrtに引数としてbを提供しているので、Haskellは戻り値の型はでなければならないことを推測しますであり、aではありません。

あなたは

distance :: Floating b => Point b -> Point b -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = x2 - x1 
     dy = y2 - y1 
+0

私に与えられたテスターを使用するはずですので、私は関数ヘッダーを変更するつもりはないことを私の割り当てで要求しています – Sal

+0

@Salこの関数を簡単にラップして元の署名を得ることができます。 'Real a'と' Fractional b 'の度に 'a'を' Point b 'にする。 – leftaroundabout

0
type Point a = (a,a) 
distance :: (Real a, Floating b) => Point a -> Point a -> b 
distance (x1,y1) (x2,y2) = sqrt ((dx * dx) + (dy * dy)) 
    where dx = realToFrac $ x2 - x1 
     dy = realToFrac $ y2 - y1 
+1

これは正しい解決策になりましたが、IMOは「ここに作業コードがあります」という回答は宿題にはあまり役に立ちません。 – leftaroundabout

+0

それは私が探している正確な答えではなく、これはもっと大きなプロジェクトのちょっとした機能でした – Sal

関連する問題