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