Dưới đây là một số pragmas và một số hàng nhập khẩu:Loại lỗi với cấp bậc-2 chủng loại và chức năng thành phần
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.ST
import Data.Array.ST
import Data.Array
Bây giờ đây là vấn đề của tôi. Các typechecks mã sau:
foo :: forall a. a -> [a]
foo x = elems $ runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Tuy nhiên, khi tôi thay thế $
với thành phần:
foo :: forall a. a -> [a]
foo x = elems . runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
tôi nhận được lỗi này:
Couldn't match expected type `forall s. ST s (STArray s i0 e0)'
with actual type `ST s0 (STArray s0 Int a)'
In the expression:
newListArray (1, 10) (replicate 10 x) :: ST s (STArray s Int a)
In the second argument of `($)', namely
`do { newListArray (1, 10) (replicate 10 x) ::
ST s (STArray s Int a) }'
In the expression:
elems . runSTArray
$ do { newListArray (1, 10) (replicate 10 x) ::
ST s (STArray s Int a) }
gì werid là, nếu tôi cung cấp cho các chức năng tạo thành tên riêng, sau đó gõ lại lần nữa:
elemSTArray = elems . runSTArray
foo :: forall a. a -> [a]
foo x = elemSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Tôi không chắc những gì đang xảy ra ở đây. Tôi mong đợi đoạn mã thứ hai để đánh máy độc đáo. Và tôi không hiểu tại sao nó lại gõ lại nếu tôi cung cấp cho hàm được tạo ra theo tên riêng của nó.
Đây là phiên bản đơn giản của một số mã mà tôi đã phá vỡ khi nâng cấp từ GHC 6.2 lên 7 và tôi đang cố gắng hiểu tại sao điều này xảy ra ngay bây giờ. Cảm ơn bạn đã trợ giúp!
Tôi không thực sự là một lập trình viên Haskell, nhưng ưu tiên của thành phần liên quan đến '$' là gì? Điều gì xảy ra nếu bạn ngoặc đơn biểu thức con 'elems. runSTArray'? – Gian
Tôi không thể sao chép điều này bằng GHC 6.12.1. – opqdonut
Gian: '$' có mức ưu tiên thấp hơn '.', vì vậy nếu tôi ngoặc đơn biểu thức con, nó sẽ hoạt động giống nhau. opqdonut: Điều này đã không xảy ra với tôi trên GHC 6.2 nhưng nó có trên GHC 7.0.3 – Drekembe