আমি যে ভাষাটি বিকাশ করছি তার জন্য আমি টাইপ ইনফেরেন্স অ্যালগরিদম খুঁজছি, তবে আমার প্রয়োজন অনুসারে এমন একটিও পাইনি কারণ সেগুলি সাধারণত হয়:
- Has লা হাস্কেল, পলিমারফিজম সহ তবে কোনও অ্যাড-হক ওভারলোডিং নেই
- C la C ++ (অটো) এতে আপনার অ্যাড-হক ওভারলোডিং রয়েছে তবে ফাংশনগুলি মনোমরফিক
বিশেষত আমার টাইপ সিস্টেমটি হ'ল (সরলীকরণ করা) (আমি হাস্কেলিস সিনট্যাক্স ব্যবহার করছি তবে এটি ভাষা অজ্ঞেয়বাদী):
data Type = Int | Double | Matrix Type | Function Type Type
এবং আমি একটি অপারেটর পেয়েছি * যা বেশ কিছু ওভারলোড পেয়েছে:
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
ইত্যাদি ...
এবং আমি এর জন্য সম্ভাব্য প্রকারগুলি নির্ধারণ করতে চাই
(2*(x => 2*x))*6
(2*(x => 2*x))*{{1,2},{3,4}}
প্রথমটি Int
, দ্বিতীয়টি Matrix Int
।
উদাহরণ (এটি কাজ করে না):
{-# 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