Tôi đang tìm kiếm một thuật toán suy luận kiểu cho một ngôn ngữ tôi đang phát triển, nhưng tôi không thể tìm thấy một thuật toán phù hợp với nhu cầu của mình vì chúng thường là:
- à la Haskell, với tính đa hình nhưng không quá tải ad-hoc
- à la C ++ (tự động) trong đó bạn có quá tải ad-hoc nhưng các chức năng là đơn hình
Cụ thể, hệ thống loại của tôi là (đơn giản hóa) (Tôi đang sử dụng cú pháp Haskellish nhưng đây là bất khả tri ngôn ngữ):
data Type = Int | Double | Matrix Type | Function Type Type
Và tôi đã có một nhà điều hành * đã có một số quá tải:
Int -> Int -> Int
(Function Int Int) -> Int -> Int
Int -> (Function Int Int) -> (Function Int Int)
(Function Int Int) -> (Function Int Int) -> (Function Int Int)
Int -> Matrix Int -> Matrix Int
Matrix Int -> Matrix Int -> Matrix Int
(Function (Matrix Int) (Matrix Int)) -> Matrix Int -> Matrix Int
Vân vân...
Và tôi muốn suy ra các loại có thể cho
(2*(x => 2*x))*6
(2*(x => 2*x))*{{1,2},{3,4}}
Thứ nhất là Int
, thứ hai Matrix Int
.
Ví dụ (không hoạt động):
{-# LANGUAGE OverlappingInstances, MultiParamTypeClasses,
FunctionalDependencies, FlexibleContexts,
FlexibleInstances, UndecidableInstances #-}
import qualified Prelude
import Prelude hiding ((+), (*))
import qualified Prelude
newtype WInt = WInt { unwrap :: Int }
liftW f a b = WInt $ f (unwrap a) (unwrap b)
class Times a b c | a b -> c where
(*) :: a -> b -> c
instance Times WInt WInt WInt where
(*) = liftW (Prelude.*)
instance (Times a b c) => Times a (r -> b) (r -> c) where
x * g = \v -> x * g v
instance Times (a -> b) a b where
f * y = f y
two = WInt 2
six = WInt 6
test :: WInt
test = (two*(\x -> two*x))*six
main = undefined