2011-02-14 13 views
24

Me pregunto por qué Haskell no tiene una sola tupla de elementos. ¿Es solo porque nadie lo necesitaba hasta ahora, o por alguna razón racional? He encontrado un interesante hilo en un comentario en el sitio web de la Real World Haskell http://book.realworldhaskell.org/read/types-and-functions.html#funcstypes.composite, y la gente adivinado varias razones como:¿Por qué Haskell no tiene una sola tupla de elemento?

  • Sin azúcar buena sintaxis.
  • Es inútil.
  • Puede pensar que un valor normal como (1) es en realidad una tupla de elemento único.

Pero, ¿alguien sabe el motivo, excepto una conjetura?

+10

Esos tres puntos suenan bastante convincentes. – delnan

+7

Puede que también pregunte, ¿por qué no hay una sola tupla de elementos en matemáticas? – luqui

+1

@luqui there is, y se llama singleton - https://en.wikipedia.org/wiki/Tuple –

Respuesta

7

La razón exacta es porque es totalmente innecesario. ¿Por qué necesitarías una sola tupla si solo puedes tener su valor?

La sintaxis también tiende a ser un poco torpe. En Python, puede tener uno-tuplas, pero se necesita una coma final para distinguirla de una expresión entre paréntesis:

onetuple = (3,) 

Con todo, no hay razón para ello. Estoy seguro de que no hay una razón "oficial" porque los diseñadores de Haskell probablemente nunca consideraron una sola tupla de elemento porque no tiene uso.

No sé si buscabas razones más allá de lo obvio, pero en este caso la respuesta obvia es la correcta.

+4

Tenga en cuenta que una sola tupla tendría un comportamiento diferente con respecto a los fondos: al igual que '(⊥, ⊥) :: (a, b)' no es lo mismo que '⊥ :: (a, b)', también lo sería 'OneTuple ⊥ :: OneTuple a' ser diferente de' ⊥ :: OneTuple a'. No puedo imaginar que sean útiles, pero vale la pena señalar. (Y la sintaxis de Python chocaría con la útil '-XTupleSections'.) –

+1

Gracias, estoy de acuerdo que es inútil, pero el hecho de que Python tenga una sola tupla sugeriría que no es una decisión de diseño tan obvia. Y me pregunté si hubo alguna discusión sobre el asunto. –

+0

@Takashi, la razón por la cual Python tiene una tupla es porque el analizador la aceptará. Sería más problemático dejarlo fuera –

32

¡Hay una lib para eso!

http://hackage.haskell.org/packages/archive/OneTuple/0.2.1/doc/html/Data-Tuple-OneTuple.html

En realidad, tenemos un OneTuple usamos todo el tiempo. Se llama Identidad, y ahora se utiliza como la base de las mónadas puros estándar en el nuevo MTL:

http://hackage.haskell.org/packages/archive/transformers/0.2.2.0/doc/html/Data-Functor-Identity.html

Y tiene un uso importante! En virtud de proporcionar un tipo constructor del tipo * -> *, se puede hacer una instancia (una trival, concedida, aunque no la más trivial) de Monad, Functor, etc., que nos permite usarla como base para transformadores pilas.

+12

¡Guau! Todo lo que puedo imaginar es real ... –

Cuestiones relacionadas