Haskell – 200 – polimorfismo e liste – 3

Continuo da qui, copio qui, scrollare fino a “Strings“.

listLength []     = (0 :: Integer)
listLength (_:xs) = 1 + listLength xs

startsWith :: String -> String -> Bool
startsWith []     _      = undefined
startsWith (_:_)  []     = undefined
startsWith (x:xs) (y:ys) = undefined

What is the type of listLength? (Feel free to ask GHCi.)

Prelude> :l 03-polymorphism-lists.lhs
[1 of 1] Compiling Main             ( 03-polymorphism-lists.lhs, interpreted )
Ok, modules loaded: Main.
*Main> :t listLength
listLength :: [t] -> Integer

Evaluate startsWith "cat" "catastrophe". What happens?

*Main> startsWith "cat" "catastrophe"
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at 03-polymorphism-lists.lhs:157:30 in main:Main

OK, prof mi hai fregato! 😯 Bisogna sempre fare attenzione con gli smarts e Dr. Brent lo è assay.

Complete the definition of startsWith by replacing undefined with appropriate expressions. startsWith should test whether the second argument has the first argument as a prefix. For example:

startsWith "cat" "catastrophe" -> True
startsWith "ban" "banana"      -> True
startsWith ""    "dog"         -> True
startsWith "at"  "catastrophe" -> False
startsWith "dog" ""            -> False

Ci ho provato senza riuscirci; poi ho googlato e ho trovato una definizione che funziona ma usa cose non ancora viste. Usa cose non ancora viste quindi non è quella che vuole il prof. E non è mia, questa:

--startsWith.hs

startsWith :: Eq a => [a] -> [a] -> Bool
startsWith [] _ = True
startsWith _ [] = False
startsWith a b = and $ zipWith (==) a b
*Main> :l startsWith.hs
[1 of 1] Compiling Main             ( startsWith.hs, interpreted )
Ok, modules loaded: Main.
*Main> startsWith "cat" "catastrophe"
True
*Main> startsWith "ban" "banana"
True
*Main> startsWith "" "dog"
True
*Main> startsWith "at" "catastrophe"
False
*Main> startsWith "dog" ""
False

Questo mi mette in depressione; ho provato e riprovato con l’idea di farla ricorsiva: controllare che x e y siano uguali e && startsWith xs ys ma non ci sono riuscito. Il guaio di essere da solo, nessuno a cui poter chiedere. Poi mi trovo anche a pensare sempre da pythonista 😐

⭕

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: