3

おそらくこれを行う方法はありませんが、念のため質問したかっただけです。

次のような単純なタプルのデータ型があります。

data Tup a = T a a

次のようなパターンシノニムがあります。

pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y)

これは に一致しT x yますが、y の平方根が得られます。それで:

let (_ :? y) = T 1 4 in y

2.0

コンストラクターとしても使用できるよう:?にしたいので、次のようなクールなことを行うことができます。

1 :? 2

に評価する

T 1.0 4.0

もちろん、同形を手動で指定する必要がありますが、この動作を可能にする構文または言語機能はありますか?

4

1 に答える 1

8

GHC 7.10以降、使用できます

pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y) where
  x :? y = T x (y^2)

私の主な懸念は、負の数には実際の平方根がなく、浮動小数点演算が不正確であるため、 と が完全に逆数ではないことですsqrt^2

于 2016-04-26T01:01:32.407 に答える