3

重複の可能性:
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.createidます。

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います。

4

0 に答える 0