إجبار غير آمن ورمز AGDA أكثر كفاءة (-FTRUST-ME-IM-AGDA)
-
27-09-2019 - |
سؤال
في قائمة 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)
المحلول
نظرًا لأن هذا سؤال بحثي ، لدينا بعض الطرق الممكنة للمضي قدمًا ، لكنهم جميعًا ينزلون إلى:
- لعب الحيل عكس أجزاء العلامات ربما
لا تنتمي إلى StackOverflow