堆棧!在現代Haskell中可以定義Omega combinator(λx.xx)嗎?我猜想,Haskell98的類型系統旨在使這樣的事情變得不可能,但現代擴展又如何呢?在現代Haskell中可以定義Omega combinator(λx.xx)嗎?
3
A
回答
4
不,但有點。這裏要欣賞的是,Haskell支持newtype
聲明中的無限制遞歸。根據Haskell的語義,newtype
是被定義的類型和其實現類型之間的同構。因此,例如這樣的定義:
newtype Identity a = Identity { runIdentity :: a }
...斷言類型Identity a
和a
是同構的。根據定義,構造函數Identity :: a -> Identity a
和觀察者runIdentity :: Identity a -> a
是逆逆。
所以從svenningsson的答案借用Scott
類型名稱,定義如下:
newtype Scott = Scott { apply :: Scott -> Scott }
...斷言類型Scott
同構於Scott -> Scott
。所以,你,而你不能直接應用Scott
本身,你可以使用同構,以獲得其對應Scott -> Scott
並應用到原:
omega :: Scott -> Scott
omega x = apply x x
或略有更有趣:
omega' :: (Scott -> Scott) -> Scott
omega' f = f (Scott f)
...這是一個固定點組合類型!這一招可以適應寫在Haskell一個版本的Y組合的:(FORALL A A - > FA) -
module Fix where
newtype Scott a = Scott { apply :: Scott a -> a }
-- | This version of 'fix' is fundamentally the Y combinator, but using the
-- 'Scott' type to get around Haskell's prohibition on self-application (see
-- the expression @apply x [email protected], which is @[email protected] applied to itself). Example:
--
-- >>> take 15 $ fix ([1..10]++)
-- [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5]
fix :: (a -> a) -> a
fix f = (\x -> f (apply x x)) (Scott (\x -> f (apply x x)))
5
嗯,你可以定義:
{-# LANGUAGE Rank2Types #-}
omega :: (forall a . a) -> b
omega x = x x
然而,這是幾乎無用的,因爲可以作爲參數傳遞的唯一價值是undefined
,所以你不能把它作爲一個組合子都沒有。即使omega omega
未能輸入檢查。
美中不足的是,爲了x x
來進行類型檢查你有一個類型爲類型x
T = t -> s
並在t
與T
統一(這樣就可以通過x
自身)。但這基本上意味着t
必須是一個類型變量,並且參數必須是完全多態的,從而使該函數無用。
8
你不能在Haskell中直接表示歐米茄。有很少的類型系統可以表示自我應用,而Haskell的類型系統不是其中之一。但是你可以編碼類型化演算和模擬歐米茄和自我應用,像這樣:
data Scott = Scott { apply :: Scott -> Scott }
omega = Scott $ \x -> apply x x
現在你可以說apply omega omega
,並得到一個非終止計算。如果你想嘗試一下在ghci中,你可能想以下Show
實例
instance Show Scott where
show (Scott _) = "Scott"
0
好,
omega :: a -> a
omega x = unsafeCoerce x x
甚至
omega :: a -> IO a
omega x = do
putStrLn "Why are you doing this to me?"
unsafeCoerce x x
main = omega omega
你爲什麼做這無限期版畫」這對我?「。
相關問題
- 1. Haskell中的Y Combinator
- 2. Haskell中可以定義一個自定義防護機制嗎?
- 3. Haskell:這個代碼可以優化嗎?
- 4. 可以在css中定義常量嗎?
- 5. mousePressed可以在類中定義嗎?
- 6. Scala:我可以推動combinator解析器在本地貪婪嗎?
- 7. 我可以在Perl中定義一段代碼嗎?
- 8. MVVM Usercontrols可以在代碼隱藏中定義屬性嗎?
- 9. 我可以在while循環中定義一個迭代器嗎?
- 10. 我可以在Atom中自定義Dart代碼的格式嗎?
- 11. Spring Webflow可以在flow.xml定義中定義bean嗎?
- 12. 在Haskell中實現Iota
- 13. C#中的NotifyIcon.ShowBalloonTip可以自定義嗎?
- 14. 定義haskell函數,可能在簽名
- 15. 這個功能可以用Haskell的類型系統實現嗎?
- 16. Ruby的實現<=> Combinator
- 17. y-combinator in StandardML
- 18. Haskell可以忽略Ints與整數嗎?
- 19. 如何在haskell中實現自定義數據的Functor實例
- 20. 您可以爲Globalize3實現自定義回退嗎?
- 21. 我可以使用Querydsl創建自定義後端實現嗎?
- 22. 我可以在環中實現迭代器end()嗎?
- 23. 函數定義在Haskell
- 24. 我可以使用自定義列表出現在警報對話框中嗎?
- 25. Y-Combinator definiton
- 26. 可以在Xamarin.Android中實現android.support.v7.util.sortedlist嗎?
- 27. 定義中使用的名稱可以在PHP中重新定義嗎?
- 28. 在eclipse中,我可以自定義委託方法代碼模板嗎?
- 29. 我們可以在開發代碼中使用自定義測試名稱嗎?
- 30. 在編譯C代碼的過程中可以看到已定義的宏嗎?
對於這種類型的簽名'歐米茄::> f(通 - > FA)'你可以定義'purePure :: Applicative f => f(a - > fa); purePure =歐米茄純粹「。 – user3237465