سؤال

في قائمة AGDA البريدية ، سأل كونور ماكبرايد:

هل هناك أي طريقة للحصول على عمليات مثل المفترض

   trustFromJust :: Maybe x -> x

ما الذي لا يتحقق بالفعل من العدل ويخطئ (بمعنى ميلنر) إذا كان لا يتغذى؟

قد تثبت AGDA ربما == Just1 A ، ويمكن القضاء على المنشئ الوسيط لنوع المجموع.

أستطيع أن أفكر في الأساليب التي تستخدم# Unsafecoerce# أو فك الارتباط# ، ولكن هل لدى أي شخص آخر أفكار؟

import GHC.Prim

trustFromJust :: Maybe x -> x
trustFromJust x = y
    where Just1 y = unsafeCoerce# x

data Just1 a = Just1 a

على الرغم من أن هذه segfaults (يمكن أن تتجنب أنواع المنشئ الفردي بعضًا من الإغلاق النفقات العامة). النواة تبدو على ما يرام على الرغم من:

main2 =
  case (Data.Maybe.Just @ Type.Integer main3)
       `cast`
       (CoUnsafe
         (Data.Maybe.Maybe Type.Integer)
         (Just1 Type.Integer)
               :: Data.Maybe.Maybe Type.Integer
                    ~
                  Just1 Type.Integer)
  of _ { Just1 y_aeb ->
  $wshowsPrec 0 y_aeb ([] @ Char)
هل كانت مفيدة؟

المحلول

نظرًا لأن هذا سؤال بحثي ، لدينا بعض الطرق الممكنة للمضي قدمًا ، لكنهم جميعًا ينزلون إلى:

  • لعب الحيل عكس أجزاء العلامات ربما
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top