2016-06-18 7 views
9

Questa potrebbe essere una domanda davvero noobish, ma non riesco a superare questo problema (dato che ho appena iniziato ad imparare Haskell).Impossibile corrispondere al tipo atteso `Testo 'con tipo effettivo` [Char]'

Ho un semplice blocco di codice:

module SomeTest where 
import Data.Text 

str = replace "ofo" "bar" "ofofo" 

Se chiamo questo con str, ottengo:

<interactive>:108:19: error: 
* Couldn't match expected type `Text' with actual type `[Char]' 
* In the first argument of `Data.Text.replace', namely `"ofo"' 
    In the expression: Data.Text.replace "ofo" "bar" "ofofo" 
    In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo" 

<interactive>:108:25: error: 
* Couldn't match expected type `Text' with actual type `[Char]' 
* In the second argument of `Data.Text.replace', namely `"bar"' 
    In the expression: Data.Text.replace "ofo" "bar" "ofofo" 
    In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo" 

<interactive>:108:31: error: 
* Couldn't match expected type `Text' with actual type `[Char]' 
* In the third argument of `Data.Text.replace', namely `"ofofo"' 
    In the expression: Data.Text.replace "ofo" "bar" "ofofo" 
    In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo" 

Non so il motivo per cui mi sto questo errore e come ottenerlo. Non è Text solo un sinonimo di [Char]?

+0

No, 'Text' è un tipo completamente diverso. 'String' è un sinonimo di' [Char] ', comunque. – melpomene

+2

Sfortunatamente, Haskell ha diversi tipi in conflitto per stringhe di caratteri. Nel tuo caso, aggiungendo '{- # LANGUAGE OverloadedStrings # -}' come la prima riga del tuo programma dovrebbe farla compilare. – stholzm

+0

Grazie, ha funzionato davvero. Per favore, rispondi a questo commento, e accetterò. –

risposta

18

Sfortunatamente, Haskell ha diversi tipi in conflitto per stringhe di caratteri. I valori letterali stringa di solito sono di tipo String che è solo un alias per [Char]. Poiché si tratta di una rappresentazione inefficiente di stringhe, esistono alternative, ad esempio Text.

Nel tuo caso, aggiungendo {-# LANGUAGE OverloadedStrings #-} come la prima riga del tuo programma lo farà compilare. Fondamentalmente le stringhe letterali possono essere di tipo Text quindi.

+12

'OverloadedStrings' converte implicitamente tutti i letterali stringa" "pippo" 'in' fromString "pippo" '. ['fromString'] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-String.html#v:fromString) è un metodo che può convertire da' String' a qualsiasi istanza di la classe 'IsString', come' Text'. – melpomene

+0

Grazie :) un'altra grande informazione. –

+4

Mentre funzionerà, potresti anche ottenere errori più complicati sui tipi ambigui perché GHC non può determinare quale istanza di "IsString" dovrebbe essere usata. Questi possono generalmente essere risolti cambiando "qualche testo" in ("qualche testo" :: Testo). –