হাস্কেলের প্রসঙ্গে ওয়াই কম্বিনেটরটি ব্যাখ্যা করার সময়, এটি সাধারণত লক্ষ্য করা যায় যে সোজা-ফরোয়ার্ড প্রয়োগটি তার পুনরাবৃত্তির ধরণের কারণে হাস্কেলে টাইপ-চেক করবে না।
উদাহরণস্বরূপ, রোসটাকোড থেকে :
The obvious definition of the Y combinator in Haskell canot be used
because it contains an infinite recursive type (a = a -> b). Defining
a data type (Mu) allows this recursion to be broken.
newtype Mu a = Roll { unroll :: Mu a -> a }
fix :: (a -> a) -> a
fix = \f -> (\x -> f (unroll x x)) $ Roll (\x -> f (unroll x x))
এবং প্রকৃতপক্ষে, "সুস্পষ্ট" সংজ্ঞা চেক টাইপ করে না:
λ> let fix f g = (\x -> \a -> f (x x) a) (\x -> \a -> f (x x) a) g
<interactive>:10:33:
Occurs check: cannot construct the infinite type:
t2 = t2 -> t0 -> t1
Expected type: t2 -> t0 -> t1
Actual type: (t2 -> t0 -> t1) -> t0 -> t1
In the first argument of `x', namely `x'
In the first argument of `f', namely `(x x)'
In the expression: f (x x) a
<interactive>:10:57:
Occurs check: cannot construct the infinite type:
t2 = t2 -> t0 -> t1
In the first argument of `x', namely `x'
In the first argument of `f', namely `(x x)'
In the expression: f (x x) a
(0.01 secs, 1033328 bytes)
ওকামলে একই সীমাবদ্ধতা বিদ্যমান:
utop # let fix f g = (fun x a -> f (x x) a) (fun x a -> f (x x) a) g;;
Error: This expression has type 'a -> 'b but an expression was expected of type 'a
The type variable 'a occurs inside 'a -> 'b
যাইহোক, ওকামালে, কেউ -rectypes
স্যুইচটিতে পাস করে পুনরাবৃত্ত প্রকারের অনুমতি দিতে পারে:
-rectypes
Allow arbitrary recursive types during type-checking. By default, only recursive
types where the recursion goes through an object type are supported.
ব্যবহার করে -rectypes
, সবকিছু কাজ করে:
utop # let fix f g = (fun x a -> f (x x) a) (fun x a -> f (x x) a) g;;
val fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
utop # let fact_improver partial n = if n = 0 then 1 else n*partial (n-1);;
val fact_improver : (int -> int) -> int -> int = <fun>
utop # (fix fact_improver) 5;;
- : int = 120
টাইপ সিস্টেম এবং টাইপ অনুমান সম্পর্কে উত্সাহী হয়ে, এটি কিছু প্রশ্ন উত্থাপন করে যা আমি এখনও উত্তর দিতে পারছি না।
- প্রথমে, টাইপ চেকার টাইপটি কীভাবে আসে
t2 = t2 -> t0 -> t1
? এই ধরণের সাথে আসার পরে, আমি অনুমান করি যে সমস্যাটি হ'ল টাইপটি (t2
ডানদিকে) নিজেকে বোঝায়? - দ্বিতীয়ত এবং সম্ভবত সবচেয়ে আকর্ষণীয়, হাস্কেল / ওকমল টাইপ সিস্টেমগুলি এটিকে অস্বীকার করার কারণ কী? আমি অনুমান করি যে এর একটি ভাল কারণ আছে যেহেতু ওচামল এটিকে ডিফল্টরূপে অনুমতি দেয় না এমনকি যদি এটি স্যুইচ দেওয়া থাকে তবে পুনরাবৃত্তির ধরণের সাথেও ডিল করতে
-rectypes
পারে।
এগুলি যদি সত্যিই বড় বিষয় হয় তবে আমি প্রাসঙ্গিক সাহিত্যের পয়েন্টারকে প্রশংসা করব।