Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 信任具有枯燥参数的函数类型_Haskell_Ghc_Coercion - Fatal编程技术网

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

一般来说,Haskell类型只有在不包含任何函数的情况下才能被信任,因为Haskell允许运行时错误和不终止,甚至只有在完全强制时才允许。所以一般来说,如果我有一个函数
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
和强制,我看不到任何地方可以放置泄漏的信息。当然,我可能错过了什么。