Tôi muốn triển khai thuật toán bằng cách sử dụng ST
đơn nguyên và STUArray
s và tôi muốn nó có thể hoạt động với cả hai dữ liệu Float
và Double
.STUArray với loại đa hình
Tôi sẽ giải thích về một ví dụ đơn giản hơn: tính toán số scanl (+) 0
đã ghi nhớ (Tôi biết nó có thể được giải quyết mà không cần STUArray
, chỉ sử dụng làm ví dụ).
{-# LANGUAGE FlexibleContexts, ScopedTypeVariables #-}
import Control.Monad
import Control.Monad.ST
import Data.Array.Unboxed
import Data.Array.ST
accumST :: forall a. (IArray UArray a, Num a) => [a] -> Int -> a
accumST vals = (!) . runSTUArray $ do
arr <- newArray (0, length vals) 0 :: ST s (STUArray s Int a)
forM_ (zip vals [1 .. length vals]) $ \(val, i) ->
readArray arr (i - 1)
>>= writeArray arr i . (+ val)
return arr
này không thành công với:
Could not deduce (MArray (STUArray s) a (ST s)) from the context()
arising from a use of 'newArray'
Possible fix:
add (MArray (STUArray s) a (ST s)) to the context of
an expression type signature
or add an instance declaration for (MArray (STUArray s) a (ST s))
Tôi không thể áp dụng các gợi ý "có thể sửa chữa". Bởi vì tôi cần phải thêm một số thứ như (forall s. MArray (STUArray s) a (ST s))
vào ngữ cảnh, nhưng không thể thực hiện được điều này ..
Quy tắc chỉ kích hoạt nếu được biên dịch với tối ưu hóa được bật. –
Tôi đã kết thúc bằng cách sử dụng giải pháp thay thế khác ngay bây giờ - xem câu trả lời bên dưới – yairchu