2015-09-21 8 views
9

Sono in grado di contrassegnare come "Safe" codice che contiene, per esempioEsiste un'alternativa "sicura" che sostituisce i dati di Data.String.Utils in Haskell?

import Data.String.Utils (replace) 

preproc :: String -> String 
preproc s = foldl1 fmap (uncurry replace <$> subs) s 
      where subs = [("1","a"),("2","bb"),("3","z"),("4","mr")("0","xx")] 

quanto (apparentemente) Data.String.Utils 's non è "sicuro".

Esiste un'alternativa sicura a replace? E perché non è sicuro allo replace?

+6

intendi, non è etichettato come "sicuro" - la funzione è perfettamente sicura - puoi creare una patch e inviarla al maintainer, probabilmente sarà felice di includerla. – Michael

+0

@Michael: Esattamente quello che dice nei documenti collegati: '{- # LANGUAGE Safe # -}' fallisce con un avviso che 'Data.String.Utils non può essere importato in sicurezza! Il modulo non è sicuro. – orome

+5

@raxacoricofallapatorius Ecco cosa sta dicendo Michael. Se fosse etichettato come sicuro, questo non accadrebbe. –

risposta

1

tl; dr: import Data.Text (replace) - se riesci a convivere con la firma del tipo più limitato?


1) Il modulo Data.String.Utils non è codificata come sicuro, anche se dovrebbe essere.

2) Il modulo Data.String.Utilsè sicuro. È sbagliato chiamarlo "non sicuro", anche se si mettono le virgolette in "sicurezza". GHC ti dice che il modulo non sarebbe sicuro, perché usa un approccio conservativo: se non può dimostrare al momento della compilazione che il modulo è sicuro, si presume che non sia sicuro. Ma non importa quanto il compilatore si lamenta del fatto che il modulo non sia sicuro, rimane comunque perfettamente al sicuro.

3) D'altra parte, sarebbe possibile scrivere un modulo, esportare alcune versioni di unsafePerformIO e contrassegnarlo come "Affidabile". GHC penserebbe che il modulo possa essere importato in sicurezza. Ma in effetti, il modulo è intrinsecamente pericoloso.

Quindi, quali sono le opzioni ora?

A) Scaricate il sorgente del pacchetto, e modificare i moduli di cui avete bisogno, e per i quali si sa che sono sicuri, ad includere un tag "Trustworthy" all'inizio: {-# LANGUAGE Trustworthy #-}

(È può inviare una patch al manutentore, oppure puoi tenerlo per te)

B) Scrivi la tua versione di replace e contrassegnala come sicura.

C) Forse è possibile utilizzare replace da Data.Text. Ma questo è limitato a Text, mentre l'altra funzione replace funziona su elenchi arbitrari.

Almeno su Hoogle non ci sono altri metodi con una firma [a] -> [a] -> [a] -> [a] per il vostro caso d'uso.

+0

"È sbagliato chiamarlo 'non sicuro'" Sì, questo ha chiaramente mandato le persone sulla strada sbagliata! – orome

+0

La domanda è veramente: come scrivo il codice qui sopra per eseguire cosa sostituisce (nel contesto dato)? A lungo termine sembra che la soluzione giusta (non elencata sopra) sia quella di avere il tag del manutentore che il pacchetto è sicuro. – orome

+0

Solo per curiosità: come mai il pacchetto non è etichettato come sicuro? Dici che dovrebbe essere sicuro (perché usa solo funzionalità sicure), ma AFAIK tali pacchetti sono normalmente etichettati come "Safe-Inferred", se sono veramente sicuri. Perché non è questo il caso per questo modulo? – Kritzefitz

Problemi correlati