Почему у Haskell нет ни одного элементарного кортежа?
Мне интересно, почему у Haskell нет ни одного элементарного кортежа. Разве это просто потому, что до сих пор никто не нуждался в ней или каких-либо разумных причин? Я нашел интересную тему в комментарии на веб-сайте Real World Haskell http://book.realworldhaskell.org/read/types-and-functions.html#funcstypes.composite, и люди догадались о различных причинах, таких как:
- Нет хорошего синтаксического сахара.
- Это бесполезно.
- Вы можете думать, что нормальное значение, подобное (1), на самом деле является одним элементом.
Но кто-нибудь знает причину, кроме предположения?
Ответы
Ответ 1
Там есть lib для этого!
http://hackage.haskell.org/packages/archive/OneTuple/0.2.1/doc/html/Data-Tuple-OneTuple.html
На самом деле у нас есть OneTuple, который мы используем все время. Он называется Identity и теперь используется как основа стандартных чистых монадов в новом mtl:
http://hackage.haskell.org/packages/archive/transformers/0.2.2.0/doc/html/Data-Functor-Identity.html
И это имеет важное значение! В силу предоставления конструктора типа * -> *
его можно сделать экземпляром (триальным, предоставленным, хотя и не самым тривиальным) Monad, Functor и т.д., Что позволяет использовать его в качестве базы для трансформатора стеки.
Ответ 2
Точная причина заключается в том, что она совершенно не нужна. Зачем вам нужен один кортеж, если вы можете просто иметь его значение?
Синтаксис также имеет тенденцию быть немного неуклюжим. В Python вы можете иметь один кортеж, но вам нужна конечная запятая, чтобы отличить ее от выражения в скобках:
onetuple = (3,)
В общем, нет причин для этого. Я уверен, что нет "официальной" причины, потому что дизайнеры Haskell, вероятно, никогда даже не рассматривали один элементный кортеж, потому что он не имеет смысла.
Я не знаю, искали ли вы какие-то причины, кроме очевидного, но в этом случае очевидный ответ правильный.