Typing Haskell

I've recently begun learning Haskell. This is my first foray into functional programming, and I must say it's fascinating. However, I had some trouble getting a good grasp on Haskell's typing system. The differences between types, type classes, type instances, type constructors, and data constructors, when to use each, and even just a good idea of what each of them are, did not want to sink in. I went through A Gentle Introduction to Haskell as my basic intro to the language, and was satisfied with the things I could do right away. But finding a good, easy to understand tutorial or explanation on the different aspects of the type system was eluding me. Then I found a link to "Tour of the Haskell Syntax" under the "Learning Haskell" page. It's written as a quick reference on the actual language syntax, with brief explanations of each rule. The section labelled "Data Types" gives a nice simple and straightfoward description of how data types are setup and used, and helped me get the glimmer of insight I needed.

Edited 2005-01-09
Added 2004-12-13


JAPHs

s iir ejkucsath alnroetph eri;split$+;print$_[$-++]until($-++>$#_);pr +int$_[$---]until($---<1);
[download]
s iir ejkucsath alnroetph eri;split$+;print$_[$-++]while($-++-$#_);pr +int$_[$---]while($----())
[download]
s oohaa ctkseurjogis; s ii rpeehrtlo nisom; +$ -= + split $ +; ; print + splice @ ## ; _ => + $ ---, $ ++ 1 while + $ ---- $ ++ @ _
[download]


Odd Ball Challenge http://rec-puzzles.org/new/sol.pl/logic/weighing/balance
{- Given the number of weighings, prints instructions to solve the foll +owing riddle: You have (3^N - 3) / 2 identical looking objects, one of which is +lighter or heavier than the others (but you don't know which). In N weighi +ngs, determine which is the odd one, and whether it is lighter or heavi +er. -} module Main where import IO import System.Environment main :: IO () main = do args <- getArgs let w :: Int w = read $ head args -- number of weighings l = labels w -- list of object labels n = length l -- number of objects you can use putStr $ " You can find the odd one out of " ++ show n ++ " objects wit +h " ++ show w ++ " weighings, as follows:\n\n"++ " 1. Assign the following \"magic number\" labels to the objec +ts:\n" ++ " " ++ unwords l ++ "\n\n" ++ " 2. Keep track of two strings of numbers, LIGHT and HEAVY.\n\ +n" ++ " 3. Record weighing results as follows:\n" ++ " If pans balance, append 1 to both LIGHT and HEAVY.\n" ++ " If left side is lighter, append 0 to LIGHT and 2 to HEAVY.\ +n" ++ " If right side is lighter, append 2 to LIGHT and 0 to HEAVY. +\n\n" ++ " 4. Perform weighings in this order:\n" ++ weighingOrder 1 w ++ "\n" ++ " 5. After " ++ show w ++ " weighings, either LIGHT or HEAVY w +ill " ++ "match one of the object labels. That object is the odd one, a +nd " ++ "its fault is shown by whether LIGHT or HEAVY matched.\n" weighingOrder :: Int -> Int -> String weighingOrder current total = " #" ++ show current ++ ":\n" ++ " Left : " ++ unwords (weighing current total '0') ++ "\n" ++ " Right: " ++ unwords (weighing current total '2') ++ "\n" ++ if current == total then "" else weighingOrder (current+1) total weighing i w lr = filter (\l -> l !! (i-1) == lr) $ labels w labels = filter (isValidLabel) . labelsOfLength -- if entire string is the same character, or it's a bad sequence, -- this label is not valid isValidLabel l = not $ or [ allSame l, badSequence l ] allSame l@(x:_) = l == (replicate (length l) x) badSequence [] = True badSequence (x:[]) = False badSequence (x:y:ys) = if x == y then badSequence (y:ys) else badChange x y where badChange '0' '1' = False badChange '1' '2' = False badChange '2' '0' = False badChange _ _ = True -- list of all strings of length n consisting of '0', '1', and '2' labelsOfLength n = foldr ($) [""] ( replicate n $ cartesia "012" ) -- Gives the cartesion product of a list and a list of lists cartesia :: [a] -> [[a]] -> [[a]] cartesia xs = concat . map ( \ys -> map ( \x -> ys ++ [x] ) xs )
[download]

<html> <head> <style type="text/css"> body { position: relative; font-family: arial; background: #ddd; } .header { border: solid 0.05em #000; background: #888; color: #ffd; padding: 1em; margin-bottom: 1em; } .main { position: relative; } .content { position: relative; border: solid 0.05em #448; background: #ddf; padding: 1em; margin-left: 8em; } .menu { position: absolute; top: 0; left: 0; border: solid 0.05em #844; background: #fdd; padding: 1em; width: 5em; height: 5em; } .menu a { display: block; } .corner { position: relative; float: left; top: -1.05em; left: -1.05em; border-left-color: transparent; border-top-color: transparent; border-right-color: inherit; border-bottom-color: inherit; border-style: solid; border-width: inherit; background: #ddd; width: 3em; height: 3em; } </style> </head> <body> <div class="header"> <h1>Website Title</h1> </div> <div class="main"> <div class="content"> <div class="corner"></div> <p> Lorem ipsum dolor sit amet, consectetuer adipiscing el +it. Phasellus ultricies nonummy nunc. Maecenas sagittis tellus vitae +diam. Nam bibendum augue non nulla. Nam vehicula urna vel arcu. Nulla + in enim. Donec neque magna, pellentesque non, consequat sit amet, pl +acerat quis, mauris. Integer nec elit ac metus pulvinar tincidunt. Ma +uris vel elit. Etiam feugiat. Etiam posuere. Integer volutpat nulla e +u leo. Cum sociis natoque penatibus et magnis dis parturient montes, +nascetur ridiculus mus. Curabitur eleifend, dolor rhoncus molestie pe +llentesque, nisl magna eleifend felis, scelerisque sodales leo turpis + at enim. Duis sapien nisi, feugiat in, facilisis sed, congue eu, orc +i. Ut ac sem. Maecenas vel dolor eget eros euismod rutrum. Curabitur +sed libero a lectus imperdiet fermentum. </p> <p> Integer eget mi ut ipsum elementum ultrices. Pellentes +que habitant morbi tristique senectus et netus et malesuada fames ac +turpis egestas. Vivamus ac augue. Aenean dapibus pretium sapien. Viva +mus orci lorem, tincidunt ut, fringilla ut, placerat viverra, lorem. +Cras a augue. Aenean eu lacus eget lectus feugiat lobortis. Nulla ull +amcorper rutrum nunc. Phasellus ullamcorper, elit quis sodales facili +sis, lectus tortor pharetra turpis, eu luctus risus nisi eu sem. Sed +eget neque. Sed viverra. Etiam dapibus, justo sed aliquam tempor, dia +m sem pulvinar nulla, eu malesuada metus sem ut nibh. Suspendisse ac +justo ac neque placerat pharetra. Duis mattis laoreet magna. Etiam me +tus nulla, interdum sed, elementum in, luctus et, ante. </p> <p> In sodales bibendum risus. Morbi quis diam. Aliquam no +n lectus. Integer vitae mi. Suspendisse sagittis, ligula at consectet +uer ultricies, pede mi rhoncus est, in iaculis mi eros eget felis. Do +nec dignissim, nisl mollis vehicula tristique, eros mauris sagittis v +elit, sit amet gravida lacus enim suscipit libero. Donec interdum tem +por nulla. Sed aliquet nulla ut massa. In vel augue. Nunc leo nulla, +tristique eget, commodo ac, gravida ac, leo. Donec velit nulla, ornar +e et, varius et, dictum eget, felis. Etiam aliquet odio tincidunt pur +us. Cum sociis natoque penatibus et magnis dis parturient montes, nas +cetur ridiculus mus. Cras tincidunt. Etiam tortor purus, tristique a, + rutrum eu, vestibulum eu, arcu. Quisque sit amet felis non ligula da +pibus feugiat. </p> <p> Curabitur at erat nec lacus tempus condimentum. Sed si +t amet ipsum. Praesent velit risus, sagittis a, vulputate eu, blandit + venenatis, quam. Aenean quis nibh id risus commodo aliquam. Suspendi +sse nec tellus eu mauris hendrerit pretium. Nullam vitae libero. Etia +m mi risus, lobortis a, eleifend id, venenatis nec, felis. Ut blandit + vestibulum libero. Nullam ultricies condimentum turpis. Nulla facili +si. Suspendisse tincidunt sagittis arcu. Donec ultrices sem ac felis +venenatis egestas. Proin faucibus lectus pharetra ante. Donec egestas +, arcu sed luctus egestas, dolor nunc pharetra odio, in laoreet pede +lectus eu quam. Quisque vitae dui at leo rutrum sagittis. Nam pretium + enim sit amet sem. Maecenas quis nisl. </p> </div> <div class="menu"> <a href="">Link One</a> <a href="">Link Two</a> <a href="">Link Three</a> <a href="">Link Four</a> </div> </div> </body> </html>
[download]