4

次の型アノテーションを持つ関数があります

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

ArrayUおよびRepaライブラリDIM1から取得されます。後でタプルとして他の関数に渡されるデータを作成します。ある時点で型変数は型と統合されますが(これもRepaからのものです)、後で型と統合する必要があります(これは私の型です)。問題は、それがすでに統合されているため、と統合できないことです。エラーが発生します。これは何らかの形の上位タイプで解決する必要があると思いますが、これをどのように書くべきかわかりません。誰か私に手を貸してもらえますか?dataLatrDrLDLCouldn'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引数を取らないので、おそらくアンボクサーを通常のランク1ポリモーフィズムを持つグローバル関数として定義できます。

正確には、型変数を複数の型と統合することは意味がありません。と統一するrことは、それと言うことになりますが、これは誤りです。上記のコードを使用すると、関数を複数のタイプにインスタンス化できます。インスタンス化は、型を割り当てる前にコードのコピーを作成することと考えてください。したがって、関数のインスタンスが1つあり、別のインスタンスがあります。UDr == UU == Dr₁ == Ur₂ == D

于 2012-11-27T20:58:51.297 に答える