Mục tiêu của tôi là để loại bỏ ()
từ các thuật ngữ, như thế này:Loại giảm vòng lặp vô hạn
(a, b) -> (a, b)
((), b) -> b
(a, ((), b)) -> (a, b)
...
Và đây là đoạn code:
{-# 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
Tuy nhiên, cố gắng nó ra:
:kind! Simplify (String, Int)
... dẫn đến vòng lặp vô hạn trong trình kiểm tra loại. Tôi nghĩ rằng gia đình loại If
nên được chăm sóc của các điều khoản irreducible, nhưng tôi rõ ràng là thiếu một cái gì đó. Nhưng cái gì?
Có vẻ như bạn đang giả định rằng tính toán loại cấp cao nhất là lười biếng, vì thế mà các chi nhánh thứ hai của 'If' sẽ không được đánh giá trừ khi nó là cần thiết. Tôi nghĩ rằng giả định là không chính đáng. –
Và bằng cách này: là đa hình trên 'op' có lẽ là sai. Ví dụ, 'Simplify (Either() Int)' có lẽ không nên giảm xuống 'Int'. –
Hành vi nào sẽ xảy ra trên '(String,(), Int)'? Cả hai giải pháp được đề xuất cho đến nay đều giảm xuống mức 'Int'. Tôi thậm chí không biết nếu nó có thể nhận được '(String, Int)'. – gallais