Haskell 信任具有枯燥参数的函数类型
一般来说,Haskell类型只有在不包含任何函数的情况下才能被信任,因为Haskell允许运行时错误和不终止,甚至只有在完全强制时才允许。所以一般来说,如果我有一个函数Haskell 信任具有枯燥参数的函数类型,haskell,ghc,coercion,Haskell,Ghc,Coercion,一般来说,Haskell类型只有在不包含任何函数的情况下才能被信任,因为Haskell允许运行时错误和不终止,甚至只有在完全强制时才允许。所以一般来说,如果我有一个函数f::X->Y,并且我有X::X,我只能相信Y,如果我强制fx。在最近的一个问题/回答中,我探讨了X类型“枯燥”的情况:具体来说,我使用的是Data.type.concurvation.concurvation: data Coercion a b where Coercion :: Coercible a b => C
f::X->Y
,并且我有X::X
,我只能相信Y
,如果我强制fx
。在最近的一个问题/回答中,我探讨了X
类型“枯燥”的情况:具体来说,我使用的是Data.type.concurvation.concurvation
:
data Coercion a b where
Coercion :: Coercible a b => Coercion a b
虽然可强制a b
约束意味着强制
不是一个完全为空的数据构造函数,但强制系统确保可强制a b
字典始终由\x->x
表示,因此它几乎可以是为空的
我的印象是,如果函数的参数在这种意义上都很无聊,那么只需使用一组类型参数应用函数一次,并强制执行结果,就可以让所有类型参数都信任它的类型,我希望有人对此加以验证或反驳。例如,考虑到Edward Kmett的
class Representational t where
rep :: Coercion a b -> Coercion (t a) (t b)
我希望这能奏效:
type family A :: k
type family B :: k
coerceAB :: Coercion A B
coerceAB = unsafeCoerce (Coercion :: Coercion () ())
reallyRepresentational :: forall t . Representational t => Proxy t
reallyRepresentational = (rep coerceAB :: Coercion (t A) (t B)) `seq` Proxy
我认为,如果
rep
的实现能够通过reallyrepresentation
,那么它就不可能在任何非底部输入上失败。这是正确的吗?“Haskell类型只有在没有箭头的情况下才能被信任,因为Haskell允许运行时错误和非终止”@BenjaminHodgson,如果您完全强制执行没有函数的内容,那么您就有了一个适当的见证。例如,一旦您强制执行类型为x:~:y
的内容,您就知道x~y
(尽管“内部”,但该证据仅在模式匹配下可用)。如果你强制执行一个函数,通常不会在Haskell中给你一个见证。我编辑了这个问题以澄清。IIUC,最后一部分使用两个skolem常量a,B
测试“代表性”,以保证它适用于所有类型。我想知道这是否与早期版本的Data.Constraint.Forall
存在同样的问题,在早期版本中,使用两个skolem常量是不够的,因为封闭类型的族能够计算有多少个参数是不同的。@chi,我考虑过这一点,但在这种情况下,用户没有太多的访问权限,由于rep
只获取Representational t
和强制,我看不到任何地方可以放置泄漏的信息。当然,我可能错过了什么。