Вот некоторые прагмы и некоторые операции импорта:
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.ST
import Data.Array.ST
import Data.Array
Теперь вот моя проблема. Следующие проверки типов кода:
foo :: forall a. a -> [a]
foo x = elems $ runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Однако, когда я заменяю $
на композицию:
foo :: forall a. a -> [a]
foo x = elems . runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
я получаю эту ошибку:
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) }
Что такое werid, если я даю композиции функции ее собственное имя, тогда он снова проверяет тип:
elemSTArray = elems . runSTArray
foo :: forall a. a -> [a]
foo x = elemSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Я не уверен, что здесь происходит. Я ожидал, что второй фрагмент кода будет хорошо проверять типы. И я не понимаю, почему он снова проверяет тип, если я даю составной функции собственное имя.
Это упрощенная версия некоторого кода, который у меня сломался при обновлении с GHC 6.2 до 7, и я пытаюсь понять, почему это происходит сейчас. Спасибо за помощь!