重複の可能性:
runSTと関数の合成
で構成したときにGHCが正しく型チェックできない奇妙なコードセグメントに遭遇しましたid
。これはGHCのバグであると確信していますが、GHC開発者にバグレポートを提出する前に、まずここで確認したいと思います。作業コードから始めましょう:
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
v :: V.Vector Int
v = V.create $ MV.replicate 1 0
これにより、STモナドに新しいベクトルが作成され、正常に機能します。
>>> v
fromList [0]
バグは、次のコマンドで作成すると発生V.create
しid
ます。
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
v :: V.Vector Int
v = id . V.create $ MV.replicate 1 0
...次のエラーで失敗します:
Couldn't match expected type `forall s.
GHC.ST.ST s (MV.MVector s a0)'
with actual type `m0 (MV.MVector
(Control.Monad.Primitive.PrimState m0) a1)'
In the return type of a call of `MV.replicate'
In the second argument of `($)', namely `MV.replicate 1 0'
In the expression: id . V.create $ MV.replicate 1 0
ただし、id
作成する代わりに適用すると、コードのタイプチェックは問題なく行われます。
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
v :: V.Vector Int
v = id $ V.create $ MV.replicate 1 0
それに基づいて、との構成に関する何かがid
、GHCを誤って一般化または特殊化しV.create
、との型の不一致を引き起こしていると推測していMV.replicate
ます。しかし、それを超えると、タイプエラーが少し頭に浮かぶため、行き詰まります。
また、単相制限の問題でもありません。NoMonomorphismRestriction
フラグを有効にしても問題は解決しません。
私が期待するので、これはかなり奇妙な問題ですid . f == f
。また、次の例でもタイプチェックに失敗するため、正しいID法も失敗します。
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
v :: V.Vector Int
v = V.create . id $ MV.replicate 1 0
これはGHCバージョン7.4.1およびを使用してvector-0.9.1
います。