gpt4 book ai didi

haskell - Forall'd 约束在 RULE 中不受 lhs 约束

转载 作者:行者123 更新时间:2023-12-04 20:44:46 24 4
gpt4 key购买 nike

我正在处理 SPECIALIZE pragma 同时试图找到 this problem 的解决方案.

我想出了这个例子:

{-# LANGUAGE FlexibleContexts, GeneralizedNewtypeDeriving #-}

import Data.Vector
import qualified Data.Vector.Generic as V

class Foo a

newtype Phantom m = T Int deriving (Show)

instance (Foo m) => Num (Phantom m)

f :: (Num r, V.Vector v r) => v r -> v r -> v r
{-# SPECIALIZE f :: (Foo m) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}
f x y = V.zipWith (+) x y

main = print "hello"

无法编译(GHC 7.6.2),因为
Forall'd constraint `Foo m' is not bound in RULE lhs .

谷歌搜索只发现了几年前的几个 GHC 错误报告。在阅读 SPECIALIZE 时,我没有看到任何关于“forall'd 约束”的内容。或 RULE .我的 specialize 签名似乎没有原始签名的多态性,并且它满足 "if-and-only-if" rule .

最佳答案

用。。。来代替

{-# SPECIALIZE f :: (Num (Phantom m)) => Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}

它会起作用。 rNum rPhantom m不是 m ,因此您不能添加约束 Num m .这是合乎逻辑的-- Num (Phantom m)不暗示 Num m并且您可以在开放世界假设下获得其他实例。

编辑:
在这种情况下,您实际上根本不需要任何约束
{-# SPECIALIZE f :: Vector (Phantom m) -> Vector (Phantom m) -> Vector (Phantom m) #-}

无论如何,如果我理解您正在尝试做的事情,那么基本问题是当您基于幻像类型参数执行优化时,您无法进行约束。

关于haskell - Forall'd 约束在 RULE 中不受 lhs 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19829627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com