3

私はさまざまな並べ替えを書いており、これをリストと配列に対しても行っています。私を悩ませていることの 1 つは、次のようなリストの多態的な並べ替え関数を記述できることです。

bubblesort :: (Ord a) => [a] -> [a]

しかし、私はUArraysに対して同じことをしようとすると:

alterUArray :: (Ix i, Ord e) => 
               (STUArray s i e -> ST s ()) -> UArray i e -> UArray i e
alterUArray alter ua = runST $ do
    mua <- thaw ua :: ST s1 (STUArray s1 i e)
    alter mua
    freeze mua

GHC からの長いエラー メッセージで失敗します (正常にUArray Int Int動作するバージョン)。を指定しようとしましたが、呼び出し{-# LANGUAGE ScopedTypeVariables #-}の型のあいまいさが解消されません。タイプのないエラー メッセージ: http://hpaste.org/84910i ethawthaw

ポリモーリックUArray操作を記述するには何が必要ですか? いくつかの基本的な制限はありますか? そのようなことを可能にするコンパイラ拡張機能はありますか?

4

3 に答える 3

0

型宣言を次のように変更します

alterUArray :: (Ix i, Ord e) => 
               (forall s. STUArray s i e -> ST s ()) -> UArray i e -> UArray i e

から型注釈を取り除きthaw uaます。

拡張機能を有効にする必要がありますRankNTypes(またはRank2Types、非推奨ですが) (ただし、使用するためにとにかくそれを行う必要はありませんrunSTか?忘れました)。

説明: 元の型宣言は次と同等です

alterUArray :: (Ix i, Ord e) => 
               forall s. (STUArray s i e -> ST s ()) -> UArray i e -> UArray i e

つまり、alterUArrayの発信者は何が何でsあるかを選択できます。alterUArray私の変化したタイプは、代わりにそれが何であるかを選択することを主張しますs。次に、コードは to の選択を延期sしますrunST。そのタイプは、選択を行うことができると主張しています。

于 2013-03-31T09:35:10.190 に答える