2014-11-06 19 views
10

OverloadedStrings estensione è davvero molto utile, tuttavia presenta alcuni aspetti negativi. Si consideri la seguente definizione di funzione:Utilizzo di stringhe di overloading

someFunction :: ToJSSTring a => a -> IO() 
someFunction = js_function . toJSSTring 

In questo caso, quando se voglio passare un valore letterale devo aggiungere una firma tipo in modo esplicito quando OverloadedStrings è abilitato:

someFunction ("This is plain string" :: String) 
someFunction ("And this one is Text" :: Data.Text.Text) 

La ragione di questo la necessità è abbastanza ovvia, suppongo che lo OverloadedStrings sia stato progettato per facilitare il passaggio di valori letterali a funzioni che hanno stringhe di testo severe, rendendo lo sviluppatore libero dalla scrittura di pack s ovunque sia necessario un valore Text.

La domanda esiste in ogni modo, ad esempio, per predefinire tutti i valori letterali stringa senza le firme di tipo su Text o String? O dovrei semplicemente dividere il mio codice in funzioni generali (con il vincolo di tipo ToJSString) e arbitrarie, che hanno stringhe di testo severe per i loro argomenti?

risposta

22

È possibile attivare ExtendedDefaultRules pure (https://www.fpcomplete.com/user/snoyberg/random-code-snippets/overloadedstrings-defaults):

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE ExtendedDefaultRules #-} 
import Data.Text (Text, pack) 

newtype JSString = JSString Text 
    deriving Show 

class ToJSString a where 
    toJSString :: a -> JSString 
instance ToJSString [Char] where 
    toJSString = toJSString . pack 
instance ToJSString Text where 
    toJSString = JSString 

someFunction :: ToJSString a => a -> IO() 
someFunction = print . toJSString 

main :: IO() 
main = someFunction "Hello World" 

EDIT Si consiglia inoltre di aggiungere default (Text) alla parte superiore del modulo di averlo utilizzare Text invece di String per impostazione predefinita.

+1

Non smetti mai di stupirmi! Molte grazie. –

Problemi correlati