2

私は最近DataKinds、演算用のコンパイル時の科学単位を使用するためにいじり始めました。私は多かれ少なかれ自分がやりたいことをする方法を見つけましたが、それはもっときれいになるかもしれないと感じています.

負になる可能性がある整数 (m^-1) が必要だったので、自然数ではなく整数を使用することにしました。しかし、あなたが:k 5それを行うとGHC.Types.Nat、私のニーズに合わないことがわかります。代わりに、独自のカスタム代数整数型を作成することになりました。それと一緒に使用する加算および減算タイプのファミリを定義するだけでなく。

しかし、これはすべて非常に間接的であるように思われます。型ファミリ内でコンパイル時にデータを操作するために既存のすべての関数を直接使用できない理由はないようです。

基本的に、次のものが本質的に自動的に生成されるようにします。

type family (a :: Int) + (b :: Int) :: Int where
    -- Should be automatically derivable from (+) applied to Int

それは可能ですか?

また、型からランタイム値を取得する簡単な方法はありますか? 具体的には、Showこれらすべての型のインスタンスを作成するときは、基本的に、ユニットの組み合わせを表すファントム型を取得して、それを文字列に変換したいだけです。私が今それを行うと考えることができるすべての方法は、本当に冗長に思えます。

4

1 に答える 1