Haskell: ricerca del secondo valore di una tupla in un elenco basato sul primo valore

StackOverflow https://stackoverflow.com/questions/815086

  •  03-07-2019
  •  | 
  •  

Domanda

Qui ho una funzione che ha lo scopo di guardare attraverso un elenco di tuple e trovare il secondo valore nella tupla prendendo il primo valore. Ecco la funzione finora:

lookup :: String -> [(String,String)] -> String
lookup _ _ [] = "Not found"
lookup x y zs = if (notFound x zs)
    then "Not found"
    else (head [b | (a,b) <- zs, (a==x)])

La funzione notFound restituisce un Bool come vero se non c'è tupla contenente la prima stringa data. Il problema è che ottengo questo errore di tipo in Hugs:

ERROR "find.hs" (line 22): Type error in explicitly typed binding
*** Term           : lookup
*** Type           : String -> [(String,String)] -> [a] -> String
*** Does not match : String -> [(String,String)] -> String

Sto pensando che abbia a che fare con il manichino " Non trovato " valore con un tipo diverso dalla stringa dall'elenco generato, ma non ne sono sicuro.

È stato utile?

Soluzione

Penso che la tua esplicita dichiarazione di tipo sia errata. Hai:

lookup :: String -> [(String,String)] -> String

ma penso che dovrebbe essere

lookup :: String -> String -> [(String,String)] -> String

In realtà, dopo averne dato un'altra occhiata, sembra che tu non stia utilizzando il secondo parametro " y " ;. Quindi potresti rimuoverlo e il trattino basso in questo modo

lookup :: String -> [(String,String)] -> String
lookup _ [] = "Not found"
lookup x zs = if (notFound x zs)
  then "Not found"
  else (head [b | (a,b) <- zs, (a==x)])

Questo ti permetterà di conservare la dichiarazione del tipo che hai.

Altri suggerimenti

a proposito, sapevi che Haskell Prelude ha già una "ricerca"? funzione per cercare le voci in un elenco di associazioni? ecco la firma del tipo (è più generale, accettando qualsiasi tipo di chiave quali istanze Eq):

lookup :: (Eq a) => a -> [(a,b)] -> Maybe b

quindi la tua funzione compirebbe qualcosa di simile al seguente

myLookup x zs = Maybe.fromMaybe "Not found" $ lookup x zs

A prima vista, sembra che forse il secondo parametro debba essere rimosso (la 'y' e il secondo trattino basso)? la ricerca ha dichiarato di accettare due parametri, non tre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top