Как применить параметр конструктора типа для GHCI - PullRequest
0 голосов
/ 05 ноября 2018

Здравствуйте, у меня есть следующая проблема: Я строю параметрическую newtype над методом, и я не знаю, как явно сказать GHCI: I want you to instiantiate this newtype using this type parameter

 newtype M a = M {fu::a->Int}

 var = M (\s-> length (s:"asa"))  #tell him i want the type parameter to be Char

 b = (fu var) 'c' 

То, что я ожидаю получить, это: 4, потому что length 'c':"aaa"==4

Что я получаю, это:

interactive>:118:5: error:
    * Couldn't match expected type `A [Char]'
                  with actual type `Ghci30.A [Char]'
      NB: `Ghci30.A' is defined at <interactive>:100:1-25
          `A' is defined at <interactive>:109:1-25
    * In the first argument of `fu', namely `b'
      In the expression: (fu b) "asa"
      In an equation for `it': it = (fu b) "asa"

1 Ответ

0 голосов
/ 05 ноября 2018

Когда вы видите такие имена, как Ghci30.A [Char], это означает, что вы переопределили свой тип A в GHCi. Это не будет проблемой, если вы использовали правильный .hs файл и перезагрузили его.

Рассмотрим этот сеанс GHCi:

> data A = A Int
> x = A 2
> data A = A Char  -- redefinition
> :t x

Каким должен быть выход? Тип x - A, но это не тот тип A, внутри которого есть Char. GHCi напечатает тип как

x :: Ghci0.A

Вы не получите ошибку снова, если вы (пере) определите x после переопределения типа A.

Если ваш случай, x, который будет переопределен, скорее всего, fu, что все еще относится к старому A. Проверьте это с помощью :t fu: если упоминается Ghci30.A, вот и все.

Для нетривиальных определений я бы рекомендовал использовать файл .hs и перезагрузить его, чтобы избежать каких-либо проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...