Почему Haskell не может решить проблему [[]] (список списков)?
Почему это не просто * -> *, так как я могу дать ему такой тип, как Int, и получить [[Int]], который имеет вид *.Почему GHCi не может решить проблему [[]]?
ответ
Я думаю, что это так же, как с Maybe Maybe
, хотя в последнем случае причина, пожалуй, яснее: конструктор типа «внешний» ожидает передачи типа доброго *
, но видит конструктор типа типа * -> *
(«внутренний» Maybe
/[]
) и жалуется. Если я прав, это не проблема с функциональностью GHCi :kind
, а с поиском правильного синтаксиса для выражения композиции конструкторов более высокого типа.
В качестве временного решения, что-то вроде
:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)
можно использовать (с соответствующим расширением языка включен - ExistentialQuantification
, я думаю, - для того, чтобы синтаксис forall
).
Эта статья из Haskell Café может быть актуальной: http://www.mail-archive.com/[email protected]/msg08530.html - Состав конструкторов типов. –
Я не думаю, что был создан экзистенциальный тип (который является '*'). Простым способом, но вне GHCi, является 'type a = [[a]]' (который является '* -> *'). – sdcvvc
@sdcvvc - это универсально квантифицированный полиморфный тип (не экзистенциальный). –
Если мы desugar [[]]
как [] []
, тогда очевидно, что он плохо созрел, потому что [] :: * -> *
.
Если вам действительно нужен «список списков», вам нужно написать два типа конструкторов вида * -> *
. Вы не можете сделать это без небольшого шаблона, потому что у Haskell нет лямбда уровня. Вы можете сделать это, хотя:
newtype Comp f g a = Comp { unComp :: f (g a) }
Теперь вы можете написать:
type ListList = Comp [] []
И писать функции, используя его:
f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp
Functor композиции, как это имеет применение в нескольких областях, в частности, Swierstra-ые годы "Data types a la carte"
- 1. Почему AMPL не может решить проблему оптимизации
- 2. Sonarqube не может решить проблему
- 3. Почему невозможно решить проблему?
- 4. Почему сервер службы Unity.Wcf не может правильно решить проблему?
- 5. Почему компилятор не может решить проблему перегрузки параметра std :: function?
- 6. не может решить проблему с завихрением
- 7. не может решить проблему BufferOverflow Exception - Java
- 8. не может решить проблему с круговой зависимостью
- 9. не может решить проблему с петлей для
- 10. Может ли компилятор решить проблему отсутствия функции?
- 11. Может ли кто-нибудь решить эту проблему?
- 12. Может ли кто-нибудь решить эту проблему?
- 13. Не удается решить проблему таблицы
- 14. Как решить проблему jQuery?
- 15. Как решить эту проблему?
- 16. Unity IOC иногда не может решить проблему зависимости
- 17. Почему sbt не может решить проблему spongeapi, которую может найти градация?
- 18. Почему IntelliJ IDEA (12.1.6) не сможет решить проблему BorderFactory.createLineBorder (...)?
- 19. Почему я не могу решить проблему с проектом maven
- 20. Почему eclipse не может решить com.google.android.gms.location.ActivityRecognitionClient?
- 21. Трэвис CI не может решить проблему в рельсах
- 22. Как решить проблему торы «объект не может быть описан»
- 23. TypeError: Ошибка # 1034 не может решить эту самую проблему
- 24. Единство МОК, не может решить проблему без параметров конструктора
- 25. Gradle не может решить проблему сонатипа Nexus в IntelliJ
- 26. не может решить проблему управления памятью в операционной системе
- 27. JSON Deserialization in .NET service - не может решить эту проблему
- 28. Как решить проблему javax.mail.AuthenticationFailedException?
- 29. Как решить проблему javax.mail.AuthenticationFailedException
- 30. Как решить проблему org.hibernate.LazyInitializationException?
Это похоже на вопрос, почему GHC не может определить тип значения 'sqr t sqrt', хотя 'sqrt' сам является' Double -> Double' – newacct
: t sqrt sqrt отлично работает в GHCI, хотя – Squidly
Это потому, что 'sqrt' является полиморфным. Лучшая аналогия: нет. – sdcvvc