像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