gpt4 book ai didi

haskell - 在 Data.Array.Unboxed 中使用 newtype 和 ghc 7.10

转载 作者:行者123 更新时间:2023-12-02 12:16:49 25 4
gpt4 key购买 nike

这在 ghc 7.8.4 中工作正常,但在 7.10.3 中失败:

{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Foo where

import qualified Data.Array.Unboxed as A
import GHC.Generics (Generic)

newtype Elt = Elt Int deriving (Eq, Ord, Show, Num, Integral, Real, Enum, A.IArray A.UArray, Generic)
type MyArr = A.UArray Int Elt

有很多消息,例如

/tmp/my.hs:9:75:
Couldn't match type ‘Int’ with ‘Elt’
arising from the coercion of the method ‘Data.Array.Base.numElements’
from type ‘forall i. A.Ix i => A.UArray i Int -> Int’
to type ‘forall i. A.Ix i => A.UArray i Elt -> Int’
Relevant role signatures:
type role A.Ix nominal
type role A.UArray nominal nominal
When deriving the instance for (A.IArray A.UArray Elt)

虽然 7.10 的发行说明没有提到这一点,但我明白了 https://ghc.haskell.org/trac/ghc/ticket/9220#comment:11承认这是一个突破性的改变。但解决方案是什么 - 我真的必须为 MyArr 创建一个新类型包装器,并为每种用途提供辅助函数吗?

最佳答案

您不必为 MyArr 创建包装器,但您必须手动写出您之前派生的实例。一种强力解决方案是手动通过 IArray 实例进行 unsafeCoerce 操作(无法coerce 的原因与您相同)无法导出)。

{-# LANGUAGE InstanceSigs, ScopedTypeVariables, MultiParamTypeClasses #-}

import Data.Array.Base
import Data.Array.IArray
import Data.Array.Unboxed
import Unsafe.Coerce

instance IArray UArray Elt where
bounds :: forall i. Ix i => UArray i Elt -> (i, i)
bounds arr = bounds (unsafeCoerce arr :: UArray i Int)

numElements :: forall i. Ix i => UArray i Elt -> Int
numElements arr = numElements (unsafeCoerce arr :: UArray i Int)

unsafeArray :: forall i. Ix i => (i,i) -> [(Int, Elt)] -> UArray i Elt
unsafeArray lu ies = unsafeCoerce (unsafeArray lu [ (i,e) | (i,Elt e) <- ies ] :: UArray i Int) :: UArray i Elt

unsafeAt :: forall i. Ix i => UArray i Elt -> Int -> Elt
unsafeAt arr ix = Elt (unsafeAt (unsafeCoerce arr :: UArray i Int) ix)

关于haskell - 在 Data.Array.Unboxed 中使用 newtype 和 ghc 7.10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40970726/

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