Когда это может изменить тип функции?

Что именно происходит со следующим?

<code>> let test = map show

> :t test
test :: [()] -> [String]

> :t (map show)
(map show) :: Show a => [a] -> [String]
</code>

Мне интересно, как я не заметил этого раньше? Я действительно столкнулся с проблемой с & quot; map fromIntegral & quot; вместо того, чтобы показывать - мой код не компилируется с формой pointfree, но работает нормально без сокращения eta.

Есть ли простое объяснение того, когда сокращение eta может изменить смысл кода на Haskell?

Ответы на вопрос(1)

Решение Вопроса

Этоограничение мономорфизма, который применяется, когда привязка не принимает параметры и позволяет привязке быть разделяемой, когда она иначе не будет вызвана полиморфизмом, по теории, что если вы не дадите ей параметр, вы захотите трактовать его как нечто ». константа -ish (следовательно, совместно используемая). Вы можете отключить его вghci с:set -XNoMonomorphismRestriction; это часто полезно вghciгде вы часто подразумеваете, что такие выражения полностью полиморфны. (В исходном файле на Haskell сделайте первую строку

 {-# LANGUAGE NoMonomorphismRestriction #-}

вместо.)

 25 апр. 2012 г., 09:10
Чтобы быть точным, это ограничение мономорфизма в сочетании с расширенными правилами по умолчанию GHCi.
 sacheie25 апр. 2012 г., 08:40
WOW я извиняюсь, должен был знать. Я даже попробовал языковую прагму, но забыл включить хеш-знаки, и GHC не говорил обычного о «вероятной причине».

Ваш ответ на вопрос