像Maybe (Lens' a b)這樣的類型不起作用,因爲Lens'是一種Rank-2類型,不能在沒有-XImpredicativeTypes擴展名(在GHC中不支持)的擴展中包裝在類型構造函數中。 因此什麼是給將在道義上有型 foo :: A -> Maybe (Lens' B C)
一種可能性是將Maybe推遲到通過延續 foo' :: ∀ y . A -> (Lens' B C ->
我受到最近Haskell博客活動的啓發,試圖在Haskell中編寫一個類似Forth的DSL。我採取的方法是同時直接和混亂: {-# LANGUAGE TypeOperators, RankNTypes, ImpredicativeTypes #-}
-- a :~> b represents a "stack transformation"
-- from stack type "a"
我與一個類型級權限的系統試驗,我試圖以禁止不從相同的「源」來源值的分配,即: data A = A { a :: Value, b :: Value }
modify :: A -> A
modify (A v) = A $ v { a = v.a } -- should work
modify (A v) = A $ v { a = v.b } -- should *NOT* work
我需要爲我正在處理的東西實現一個通用堆棧。這個堆棧應該能夠保存不同類型的元素。例如(1,'c',True,「字符串」)。要支持的功能是top,pop和push。 元組是最自然的想法。 push x s = (x,s)
pop s = snd s
top s = (fst s, s)
但我也需要支持空棧。這裏,pop和top沒有在()上定義。 所以我嘗試創建一個新類型。 data Stack