Amacım bu gibi terimlerden ()
ortadan kaldırmaktır:Tip azaltma sonsuz döngü
(a, b) -> (a, b)
((), b) -> b
(a, ((), b)) -> (a, b)
...
Ve bu kod şudur: bunu deneyerek, Ancak
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Simplify where
import Data.Type.Bool
import Data.Type.Equality
type family Simplify x where
Simplify (op() x) = Simplify x
Simplify (op x()) = Simplify x
Simplify (op x y) = If (x == Simplify x && y == Simplify y)
(op x y)
(Simplify (op (Simplify x) (Simplify y)))
Simplify x = x
:
:kind! Simplify (String, Int)
... tip denetleyicide sonsuz bir döngüye yol açar. Ben If
tipi ailenin indirgenemez terimlerle ilgilenmesi gerektiğini düşünüyorum, ama açıkçası bir şey eksik. Ama ne?
, gerekli olmadıkça 'If' ikinci dal değerlendirmeye alınmayacaktır dolayısıyla söyledi. Bu varsayımın gereksiz olduğunu düşünüyorum. –
Ve bu arada: 'op' üzerinden polimorfik olmak muhtemelen yanlıştır. Örneğin, 'Basitleştir (Either() Int)' muhtemelen 'Int''e indirmemelidir. –
Davranışta ne olmalı? (String,(), Int) '? Her iki çözüm de şimdiye kadar bunu önerdi ki 'Int'. Hatta (String, Int) 'ın mümkün olup olmadığını bile bilmiyorum. – gallais