
On Sat, Jan 15, 2022 at 09:32:27AM -0500, Terry Phelps wrote:
last [] = [] (Yes, I know that's not a non-empty list, but I don't want ghci whining about non-exhaustive patterns). Then I added:
last [x] = x And I checked the type: :t last last:: [a] -> [a]
Yes, that looks right. There seems to be only one other case: 2 or more elements. So I wrote:
last (x:y:xs) = last (y:xs)
The first problem is that you've defined three different functions, each overriding the next Prelude> foo s = "Hello " ++ s Prelude> foo s = "Goodbye " ++ s Prelude> foo "Tom" "Goodbye Tom" I suggest putting the functions in a source file, say "test.hs" and then loading it in GHCi instead. I also suggest calling your function "mylast" because Prelude already exports a function called "last": % cat test.hs mylast [] = [] mylast [x] = x mylast (x:y:xs) = mylast (y:xs) % ghci ... Prelude> :l test.hs [1 of 1] Compiling Main ( test.hs, interpreted ) Ok, one module loaded. *Main> :t mylast mylast :: [[a]] -> [a] *Main> mylast [[1,2], [3,4]] [3,4] It kind of does what you want, but not quite. That's the next problem for you to solve! Good luck and enjoy. Tom