パラメータの値は、の変数の型の値です。 T
には変数がないため、パラメトリックは適用されません。 Infactは、T型T
がチューリングマシンの電源ユニバーサル正式なシステムと同等、Untyped Lambda Calculusの実装である多くの住民
ap :: T -> T -> T
ap (MkT f) t = f t
idT :: T
idT = MkT id
constT :: T
constT = MkT $ \t -> MkT $ \_ -> t
axiom_sT :: T
axiom_sT = MkT $ \f -> MkT $ \g -> MkT $ \a -> (g `ap` a) `ap` (f `ap` a)
を有しています。上記の3つの機能(プラスap
)は、同等の正式なシステムであるSKI計算を構成します。
任意のHaskellデータ型をT
にエンコードすることは可能です。あなたはしかし、部分的に正しいか、今T
church :: Nat -> T
church Zero = MkT $ \f -> MkT $ \x -> x
church (Succ n) = MkT $ \f -> MkT $ \x -> f `ap` (church n)
に我々はNat
エンコードすることができ、自然数
data Nat = Zero | Succ Nat
の型を考えてみましょう。 Haskellにはこれの逆関数を書く方法はありません(私が知る限り)。それは本当に残念です。あなたはタイプT -> IO Nat
で擬似逆数を書くことができますが。また、GHCのオプティマイザは再帰的に死ぬことができると私は理解していますnewtypes
(私はこれについて間違っていると誰かが私を修正してください。
代わりに、タイプの例外を除いて、ラムダ計算で
ap (MkT f) a = f a
ap (Failed s) _ = Failed s
と
data T = MkT (T -> T) | Failed String
は、完全に反転可能な方法で使用することができます。
結論として、ある意味ではT
は有用なタイプではありませんが、別の意味では最も有用なタイプのすべてです。
私の混乱を明確にしてくれてありがとう。 –
残念ながら、あなたは間違っていません。少なくとも、GHC 7.6のインライナは、負の再帰を伴う型を含むいくつかの式でパニックになる可能性があります(これは 'data'と' newtype'でも起こります)。正の再帰 - つまり、 ' - >'の右辺 - はうまくいくはずです。 – shachaf