Data.Text vs Ssortingng

Bien que l’opinion générale de la communauté Haskell semble être qu’il est toujours préférable d’utiliser Text place de Ssortingng , le fait que les API de la plupart des bibliothèques maintenues soient toujours orientées sur la Ssortingng me dérange. D’un autre côté, il existe des projets notables , qui considèrent Ssortingng comme une erreur et fournissent un Prelude avec toutes les instances de fonctions orientées Ssortingng remplacées par leurs parties de Text .

Y a-t-il des raisons pour que les gens continuent à écrire des API basées sur des Ssortingng exception de la compatibilité avec Prelude en amont et en aval et des “intertia de commutateurs”? Existe-t-il d’autres inconvénients à Text par rapport à Ssortingng ?

En particulier, cela m’intéresse car je conçois une bibliothèque et essaie de décider quel type utiliser pour exprimer des messages d’erreur.

Je suppose que la plupart des auteurs de bibliothèques ne veulent pas append plus de dépendances que nécessaire. Étant donné que les chaînes font littéralement partie de chaque dissortingbution Haskell (cela fait partie de la norme de langage!), Il est beaucoup plus facile de les adopter si vous utilisez des chaînes et que vos utilisateurs ne doivent pas sortinger les dissortingbutions de texte.

C’est une de ces «erreurs de conception» qu’il vous suffit de vivre, à moins que vous ne puissiez convaincre la plupart des membres de la communauté de passer la nuit. Il suffit de regarder combien de temps cela a pris pour que Applicative devienne une super-classe de Monad – un changement relativement mineur mais très recherché – et imaginez combien de temps il faudrait pour remplacer toutes les choses Ssortingng avec Text.


Pour répondre à votre question plus spécifique: j’irais avec Ssortingng à moins que vous n’obteniez des avantages notables en termes de performances en utilisant Text. Les messages d’erreur sont généralement de petites choses ponctuelles, donc l’utilisation de Ssortingng ne devrait pas poser de gros problèmes.

D’un autre côté, si vous êtes le genre de puriste idéologique qui évite le pragmatisme de l’idéalisme, optez pour Text.


* Je mets les erreurs de conception dans les citations de peur car les chaînes de caractères en tant que liste de caractères constituent une propriété intéressante qui les rend faciles à raisonner et à intégrer aux autres fonctions d’exploitation de listes existantes.

Si votre API est destinée à traiter de grandes quantités de données orientées caractères et / ou différents codages, votre API doit utiliser du texte .

Si votre API est principalement destinée à gérer de petites chaînes uniques, l’utilisation du type de chaîne intégré devrait suffire.

L’utilisation de Ssortingng pour de grandes quantités de texte fera que les applications utilisant votre API consumnt beaucoup plus de mémoire. Son utilisation avec des codages étrangers pourrait sérieusement compliquer l’utilisation selon le fonctionnement de votre API.

La chaîne est assez chère (au moins 5N mots où N est le nombre de Char dans la chaîne). Un mot a le même nombre de bits que l’architecture du processeur (ex. 32 bits ou 64 bits): http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html

Il y a au moins trois raisons d’utiliser [Char] dans les petits projets.

  1. [Char] ne dépend d’aucun personnel obscur, comme des pointeurs étrangers, de la mémoire brute, des tableaux bruts, etc., qui peuvent fonctionner différemment sur différentes plates-formes ou même être totalement indisponibles

  2. [Char] est la lingua franka en haskell. Il existe au moins trois manières «efficaces» de gérer les données unicode dans haskell: utf8-bytessortingng , Data.Text.Text et Data.Vector.Unboxed.Vector Char , chacune nécessitant un traitement supplémentaire.

  3. en utilisant [Char] on accède à toute la puissance de [] monad, y compris de nombreuses fonctions spécifiques (des paquets de chaînes alternatifs essayent de l’aider, mais quand même)

Personnellement, j’estime que Data.Text, basé sur Data.Text un des Data.Text les plus discutables de la communauté haskell, puisque utf16 combine des failles à la fois de l’encodage utf8 et de l’ utf32 tout en ne présentant aucun des avantages.

Je me demande si Data.Text est toujours plus efficace que Data.Ssortingng ???

“contre” par exemple est O (1) pour les chaînes et O (n) pour le texte. Append est O (n) pour les chaînes et O (n + m) pour les textes ssortingctes. Également,

  let foo = "foo" ++ bigchunk bar = "bar" ++ bigchunk 

est plus efficace pour les chaînes que pour les textes ssortingcts.

Un autre problème non lié à l’efficacité est la correspondance de modèle (code clair) et la paresse (de manière prévisible par caractère dans les chaînes, l’implémentation étant en quelque sorte dépendante du texte paresseux).

Les textes sont évidemment bons pour les séquences de caractères statiques et pour la modification sur place. Pour d’autres formes de modification structurelle, Data.Ssortingng peut présenter des avantages.

Je ne pense pas qu’il y ait une seule raison technique pour que Ssortingng rest. Et je peux voir plusieurs pour que ça aille.

Dans l’ensemble, j’affirme d’abord que dans l’affaire Text / Ssortingng, il n’existe qu’une seule meilleure solution:

  • Les performances des cordes sont mauvaises, tout le monde est d’accord là-dessus

  • Le texte n’est pas difficile à utiliser. Toutes les fonctions couramment utilisées sur Ssortingng sont disponibles sur Text, plus utiles dans le contexte des chaînes (substitution, padding, encoding)

  • Avoir deux solutions crée une complexité inutile à moins que toutes les fonctions de base soient rendues polymorphes. Preuve: il y a des questions sur le sujet des conversions automatiques . Donc c’est un problème.

Donc, une solution est moins complexe que deux et les lacunes de Ssortingng le feront disparaître par la suite. Le plus tôt sera le mieux !