以下のコードでエラーが発生します。タイプStorable a
のVector
を返すdispatch
関数の型シグニチャと関係があると思われます。私のエラーを想定しタイプマッチのためにStorableの限定サブセットを定義する
test.hs:11:18:
Couldn't match type `CChar' with `Int32'
Expected type: Vector a
Actual type: Vector Int32
In the expression: x
In an equation for `dispatch': dispatch (I x) = x
Failed, modules loaded: none.
私はこの質問をしています:
{-# LANGUAGE BangPatterns #-}
import Data.Vector.Storable as SV
import Foreign.C.Types (CChar)
import GHC.Int (Int32)
data AList = I {-# UNPACK #-} !(SV.Vector Int32)
| S {-# UNPACK #-} !(SV.Vector CChar)
dispatch :: (Storable a) => AList -> SV.Vector a
dispatch (I x) = x
dispatch (S x) = x
エラーをGHCiの7.4.1に:のみInt32
とCChar
型シグネチャに行うためにdispatch
関数の型シグネチャを更新するための簡単な方法は何ですか診断は正しい。私の診断が間違っている場合、私は上記のエラーを解決する方法のポイントを感謝します。
感謝。それはまさに私が探していたものです。私が書いたことは正しいとは思わない。今、私はexitentialの型についてもっと学びました:)結局、別の型に変換するためにケースに基づいてディスパッチを行います。だから私はAListのための組合にタグをつけたのです。 – Sal
ちょうど実現したGADTは別の方法かもしれません。基本的に、ディスパッチにはタイプシグネチャがあります。(Storable a)=> AList(SV.Vector a) - > SV.Vector a。 GADTを使用して(AList a)を定義した後。私は例を試したところ、マッチするタイプのトリックをするようです。これがうまくいくと思うのであれば、上記の回答をGADTの別の方法でも編集できれば幸いです。サンプルコードはこちら:http://hpaste.org/57584 – Sal
残念ながら、おそらくあなたが望むことはしません。私は解説を拡大して説明しました。ちなみに、私の答えに示すように、dispatch' 'に' Storable'制約は何もしていない、とあなたはAList'は直接要素にベクトルのタイプではなく、入力 'parametriseことができます。 – ehird