Ошибка типа с типами ранга-2 и составом функций

Вот некоторые прагмы и некоторые операции импорта:

{-# 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, и я пытаюсь понять, почему это происходит сейчас. Спасибо за помощь!

17
задан Drekembe 1 December 2011 в 14:50
поделиться