অনুমান + ওভারলোডিং টাইপ করুন


9

আমি যে ভাষাটি বিকাশ করছি তার জন্য আমি টাইপ ইনফেরেন্স অ্যালগরিদম খুঁজছি, তবে আমার প্রয়োজন অনুসারে এমন একটিও পাইনি কারণ সেগুলি সাধারণত হয়:

  • 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

3
এটি সিএস থিওরী স্ট্যাক এক্সচেঞ্জের মানদণ্ডগুলি পূরণ করে বলে মনে হচ্ছে না, তবে দেখে মনে হচ্ছে আপনি আরও গাণিতিক বা তাত্ত্বিক উত্তর খুঁজছেন। আমি মনে করি কম্পিউটার বিজ্ঞান এটির জন্য উপযুক্ত হতে পারে। যেহেতু আপনি আরও ভাল উত্তর পেতে একটি পদক্ষেপের অনুরোধ করেছেন, আমি এটি সেখানে প্রেরণ করব যেখানে এটির ভাল উত্তর পাওয়ার সম্ভাবনা রয়েছে।
টমাস

উত্তর:


9

আমি জেফ্রি সেওয়ার্ড স্মিথের গবেষণামূলক প্রবন্ধটি দেখার পরামর্শ দিচ্ছি

আপনি সম্ভবত ইতিমধ্যে জানেন যে, সাধারণ ধরণের আনফারেন্স অ্যালগরিদমগুলি যেভাবে কাজ করে তা হ'ল তারা সিনট্যাক্স ট্রিটিকে অতিক্রম করে এবং প্রতিটি সুপ্রপ্রেসের জন্য তারা একটি টাইপ সীমাবদ্ধতা উত্পন্ন করে। তারপরে, তারা এই প্রতিবন্ধকতাগুলি গ্রহণ করে, তাদের মধ্যে সম্মিলন অনুমান করে এবং তাদের সমাধান করে (সাধারণত কোনও সাধারণ সমাধানের সন্ধান করে)।

আপনার যখন ওভারলোডিং থাকে তখন কোনও ওভারলোডেড অপারেটর বিশ্লেষণ করার সময় আপনি একের পরিবর্তে বিভিন্ন ধরণের সীমাবদ্ধতা তৈরি করেন এবং যদি ওভারলোডিংটি সীমাবদ্ধ থাকে তবে তাদের মধ্যে বিযুক্তি অনুমান করুন। কারণ আপনি অপরিহার্যভাবে বলছেন যে অপারেটরের কাছে this `এটি, বা এটি, বা এই ধরণের থাকতে পারে" "এটি যদি সীমাহীন হয় তবে একমাত্র পলিমারফিক প্রকারের মতো, তবে অতিরিক্ত বাধাগুলির সাথে সর্বজনীন চূড়ান্ত অবলম্বন করা উচিত actual ওভারলোডিংয়ের প্রকারগুলি: আমি যে কাগজটি উল্লেখ করেছি সেগুলি এই বিষয়গুলিকে আরও গভীরতার সাথে কভার করে।


আপনাকে অনেক ধন্যবাদ, এই উত্তরটি আমি খুঁজছিলাম
miniBill

7

অদ্ভুতভাবে যথেষ্ট, হাস্কেল নিজেই আপনার উদাহরণের জন্য প্রায় পুরোপুরি সক্ষম; হ্যান্ডলি-মিলনার ওভারলোডিংয়ের সাথে পুরোপুরি ঠিকঠাক, যতক্ষণ এটি সুনিশ্চিত:

{-# LANGUAGE OverlappingInstances, MultiParamTypeClasses,
             FunctionalDependencies, FlexibleContexts,
             FlexibleInstances #-}
import Prelude hiding ((*))

class Times a b c | a b -> c where
    (*) :: a -> b -> c

instance Times Int Int Int where
    (*) = (Prelude.*)

instance Times Double Double Double where
    (*) = (Prelude.*)

instance (Times a b c) => Times (r -> a) (r -> b) (r -> c) where
    f * g = \v -> f v * g v

instance (Times a b c) => Times a (r -> b) (r -> c) where
    x * g = \v -> x * g v

instance (Times a b c) => Times (r -> a) b (r -> c) where
    f * y = \v -> f v * y

type Matrix a = (Int, Int) -> a

তুমি করেছ! ঠিক আছে, বাদে আপনার ডিফল্ট প্রয়োজন। যদি আপনার ভাষা Timesক্লাসকে ডিফল্টরূপে Int(এবং তারপরে Double) মঞ্জুরি দেয় তবে আপনার উদাহরণগুলি বর্ণিত হিসাবে ঠিক কাজ করবে। এটির সমাধানের অন্য উপায়টি হ'ল স্বয়ংক্রিয়ভাবে প্রচার Intকরা Doubleবা তাত্ক্ষণিকভাবে প্রয়োজন হলে কেবল তা করা না করা এবং Intআক্ষরিক হিসাবে Intকেবল (তত্ক্ষণাত্ যখন প্রয়োজন হয় কেবল তখনই প্রচার করা হয়) ব্যবহার করা; এই সমাধানটিও কাজ করবে।


2
আপনাকে অনেক ধন্যবাদ! (যদিও এক্সটেনশনের সংখ্যা
কেজির


1
এটি কোনও ডিফল্ট সমস্যা নয়: ideone.com/LrfEjX
miniBill

1
ওহ, দুঃখিত, আমি তখন আপনাকে ভুল বুঝেছিলাম। ঠিক আছে, আমি ডিফল্ট চাই না (আমার মনে হয়) ..
miniBill

2
সংকলনকারী উদাহরণ তৈরি করার চেষ্টা করতে পারেন?
মিনিবিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.