4

我有一个具有以下类型签名的函数

{-# LANGUAGE FlexibleContexts #-}
dataLat :: Load r DIM1 Double
        => (Array r DIM1 Double -> Array U DIM1 Double, Array U DIM1 Double)

Array,来自URepa图书馆。创建稍后作为元组传递给其他函数的数据。在某一时刻,类型变量与类型统一(这再次来自 Repa),但稍后也应该与类型统一(这是我的类型)。问题是已经统一了,所以不能统一。我以错误告终。我认为这应该通过某种形式的更高级别的类型来解决,但我无法弄清楚应该如何写。谁能帮我一把?DIM1dataLatrDrLDLCouldn't match expected type

4

2 回答 2

3
Try {-# LANGUAGE NoMonomorphismRestriction #-}

http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/monomorphism.html

于 2012-11-27T23:48:43.423 回答
2

你可以给dataLat一个类型说它返回一个多态函数,使用Rank2Types.

newtype Unboxer =
  Unboxer {applyUnboxer :: forall repr. Load repr DIM1 Double => Array repr DIM1 Double -> Array U DIM1 Double}

dataLat :: (Unboxer, Array U DIM1 Double)

的主体dataLat必须将多态函数放入Unboxer. 字段访问器 ,applyUnboxer返回一个可用于不同类型的多态函数。

我不清楚您是否真的需要 2 级类型。由于dataLat不带参数,您可以将拆箱器定义为具有普通 rank-1 多态性的全局函数。

准确地说,将一个类型变量与多种类型统一起来是没有意义的。rUand统一D就等于说r == Uand U == D,这是错误的。上面的代码允许将一个函数实例化为多种类型。将实例化视为在分配类型之前制作代码的副本,因此您拥有函数 where 的一个实例r₁ == U和一个单独的实例 where r₂ == D

于 2012-11-27T20:58:51.297 回答