IHaskell/IHaskell.ipynb

710 lines
64 KiB
Plaintext
Raw Normal View History

2013-12-30 17:18:10 -05:00
{
"metadata": {
"language": "haskell",
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- First of all, we can evaluate simple expressions.\n",
"3 + 5\n",
"\"Hello, \" ++ \"World!\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"8"
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"\"Hello, World!\""
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- Unlike in GHCi, we can have multi-line expressions.\n",
"concat [\n",
" \"Hello,\",\n",
" \", \",\n",
" \"World!\"\n",
" ] :: String\n",
" \n",
"-- We can also have normal Haskell declarations, without `let`.\n",
"-- As long as you group type signatures and declarations together,\n",
"-- you can use pattern matching and add type signatures.\n",
"thing :: String -> Int -> Int\n",
"thing \"no\" _ = 100\n",
"thing str int = int + length str\n",
"\n",
"thing \"no\" 10\n",
"thing \"ah\" 10"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"\"Hello,, World!\""
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"100"
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"12"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- We can also do IO.\n",
"print \"What's going on?\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"\"What's going on?\""
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- We can disable extensions.\n",
":ext NoEmptyDataDecls\n",
"data Thing"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<span style='color: red; font-style: italic;'>`Thing' has no constructors<br/> (-XEmptyDataDecls permits this)</span>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"`Thing' has no constructors\n",
" (-XEmptyDataDecls permits this)"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- And enable extensions.\n",
":ext EmptyDataDecls\n",
"data Thing"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- Various data declarations work fine.\n",
"data One\n",
" = A String\n",
" | B Int\n",
" deriving Show\n",
"\n",
"print [A \"Hello\", B 10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"[A \"Hello\",B 10]"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- We can look at types like in GHCi.\n",
":ty 3 + 3"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<span style='font-weight: bold; color: green;'>forall a. Num a => a</span>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"forall a. Num a => a"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- And we can inspect info of things!\n",
":info Integral"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"class (Real a, Enum a) => Integral a where\n",
" quot :: a -> a -> a\n",
" rem :: a -> a -> a\n",
" div :: a -> a -> a\n",
" mod :: a -> a -> a\n",
" quotRem :: a -> a -> (a, a)\n",
" divMod :: a -> a -> (a, a)\n",
" toInteger :: a -> Integer\n",
" \t-- Defined in `GHC.Real'\n",
"instance Integral Integer -- Defined in `GHC.Real'\n",
"instance Integral Int -- Defined in `GHC.Real'"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- Results are printed as we go, even from a single expression.\n",
"import Control.Monad\n",
"import Control.Concurrent\n",
"\n",
"forM_ [1..5] $ \\x -> do\n",
" print x\n",
" threadDelay $ 100 * 1000"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"1\n",
"2\n",
"3\n",
"4\n",
"5"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- We can display Maybes fancily for Show-able types.\n",
"Just ()\n",
"Nothing\n",
"\n",
"-- But it dies if it's not showable.\n",
"data NoShow = X Int\n",
"Just (X 3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<span style='color: green; font-weight: bold;'>Just</span><span style='font-family: monospace;'>()</span>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"Just ()"
]
},
{
"html": [
"<span style='color: red; font-weight: bold;'>Nothing</span>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"Nothing"
]
},
{
"html": [
"<span style='color: red; font-style: italic;'>No instance for (Show NoShow)<br/> arising from a use of `print'<br/>Possible fix:<br/> add an instance declaration for (Show NoShow)</span>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"No instance for (Show NoShow)\n",
" arising from a use of `print'\n",
"Possible fix:\n",
" add an instance declaration for (Show NoShow)"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- Aeson JSON data types are displayed nicely.\n",
":ext OverloadedStrings\n",
"\n",
"import Data.Aeson\n",
"\n",
"data Coord = Coord { x :: Double, y :: Double }\n",
"instance ToJSON Coord where\n",
" toJSON (Coord x y) = object [\"x\" .= x, \"y\" .= y]\n",
"\n",
"Null\n",
"Bool True\n",
"toJSON (Coord 3 2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div class=\"highlight-code\" id=\"javascript\">null</div>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"null"
]
},
{
"html": [
"<div class=\"highlight-code\" id=\"javascript\">true</div>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"true"
]
},
{
"html": [
"<div class=\"highlight-code\" id=\"javascript\">{\n",
" \"x\": 3.0,\n",
" \"y\": 2.0\n",
"}</div>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"{\n",
" \"x\": 3.0,\n",
" \"y\": 2.0\n",
"}"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- Small bits of HTML generated via Blaze are displayed.\n",
"import Prelude hiding (div, id)\n",
"import Text.Blaze.Html4.Strict hiding (map, style)\n",
"import Text.Blaze.Html4.Strict.Attributes\n",
"\n",
"div ! style \"color: red\" $ do\n",
" p \"This is an example of BlazeMarkup syntax.\"\n",
" b \"Hello\"\n",
" \n",
"forM [1..5] $ \\size -> do\n",
" let s = toValue $ size * 80\n",
" img ! src \"/static/base/images/ipynblogo.png\" ! width s"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"color: red\">\n",
" <p>\n",
" This is an example of BlazeMarkup syntax.\n",
" </p>\n",
" <b>\n",
" Hello\n",
" </b>\n",
"</div>\n"
],
"metadata": {},
"output_type": "display_data",
"text": [
"<div style=\"color: red\">\n",
" <p>\n",
" This is an example of BlazeMarkup syntax.\n",
" </p>\n",
" <b>\n",
" Hello\n",
" </b>\n",
"</div>"
]
},
{
"html": [
"<img src=\"/static/base/images/ipynblogo.png\" width=\"80\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"160\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"240\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"320\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"400\">\n"
],
"metadata": {},
"output_type": "display_data",
"text": [
"<img src=\"/static/base/images/ipynblogo.png\" width=\"80\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"160\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"240\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"320\">\n",
"<img src=\"/static/base/images/ipynblogo.png\" width=\"400\">"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- We can draw diagrams, right in the notebook.\n",
":extension NoMonomorphismRestriction\n",
"import Diagrams.Prelude\n",
"\n",
"-- By Brent Yorgey\n",
"-- Draw a Sierpinski triangle!\n",
"sierpinski 1 = eqTriangle 1\n",
"sierpinski n = s\n",
" ===\n",
" (s ||| s) # centerX\n",
" where s = sierpinski (n-1)\n",
"\n",
"-- The `diagram` function is used to display them in the notebook.\n",
"diagram $ sierpinski 4\n",
" # centerXY\n",
" # fc black\n",
" `atop` square 10\n",
" # fc white"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- We can draw small charts in the notebook.\n",
"-- This example is taken from the haskell-chart documentation.\n",
"import Graphics.Rendering.Chart \n",
"import Data.Default.Class\n",
"import Control.Lens\n",
"\n",
"let values = [\n",
" (\"Mexico City\" , 19.2, 0),\n",
" (\"Mumbai\" , 12.9, 10), \n",
" (\"Sydney\" , 4.3, 0),\n",
" (\"London\" , 8.3, 0), \n",
" (\"New York\" , 8.2, 25)]\n",
" \n",
"pitem (s, v, o) = pitem_value .~ v\n",
" $ pitem_label .~ s\n",
" $ pitem_offset .~ o\n",
" $ def \n",
"\n",
"-- Convert to a renderable in order to display it.\n",
"toRenderable \n",
" $ pie_title .~ \"Relative Population\"\n",
" $ pie_plot . pie_data .~ map pitem values\n",
" $ def"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdd3xUVf7/8dekEHokSCgqLE1kERBX6QhBMAIWBAR2IRFs+BUQQVgVcLFgWxBcRXYXo8viooCFIgJKKNJ7UQIIBkIvoSQQUiaTub8/ZuXHQibcJDNzJzPv58M/NPnMve9RmXxyzrnn2AzDQEREREQ8J8TqACIiIiKBRg2WiIiIiIepwRIRERHxMDVYIiIiIh6mBktERETEw8KsDiAi3tW/f/9ffvnl8j+Gh4fXq1evV69eDz300HVf27Jly7y8vEWLFlWpUsVdzYkTJzIzM6tVq1auXDmgfv36hmGsWrWqRo0ank0eHR3dunXrYcOGlS9fvphXdsfa9ysigcSmbRpEAtudd965ffv2a7/+6aefDhw4sODXhoeHOxyOY8eOFdA9dO7cOTExcc6cOY8++ihgs9mAQ4cO1axZs3jB80/epk2b1atXu+7icda+XxEJJJoiFAkKL7300vr169evXz937tx69eoB7777rjdutGXLli1btlSrVs1TF3z++efXr1+/fPny//u//wPWrl27evVqT128+Dz+fkUkMKjBEgkKderUadmyZcuWLbt37/7iiy8CBw8edA1gp6WlDR48+Lbbbvvd737Xs2fPvXv35nuFQ4cO/fGPf7ztttsaNGgQFxc3b948YOjQoTt37gQmTpz44YcfAiNHjnzhhRfOnz8/bty4Dh06jB8/3vXyPXv2dOjQITY21m63m78p8Lvf/a5ly5YxMTFTpkxx9TGu4ry8vPHjxzdt2rR8+fINGzYcMWJEVlaW68odOnTo3r37qlWrevbsWa9evf79+x8/ftx1Ndd3O3TokJmZ6fpKTExMhw4dTp06Vcz3W0AkwOl0durUqVOnThs3buzZs2f9+vWfeeaZfEcWRSRAGCIS0Jo1awZMmzbt8lfi4+OBNm3aGIaRm5vbpEkToHLlyvXr1wcqVaq0a9cuV2VYWBhw7NgxwzDq1KkD1K5du02bNiEhITabbd26df3797/hhhuAhg0bvvXWW8ZvSw4OHTr0xRdfADVq1HBd6s033wR69ep13Ztelfz99993/WN6enqZMmWAmTNnGobRr18/172aNGkSEhICtG3b1ul0nj59GoiIiChbtmxUVJSrpnbt2llZWYZhuL4LXLhwwXVZ1xxfSkpKMd9vAZEMw8jLy3N9q3LlyrfffntoaChQtWrVnJwcL/w3FxHrqcESCXCuNiU6Orp+/fr169d39QeNGjXav3+/YRgzZswAGjRokJ2dbRiGa1XW008/7Xrt5YYjOTm5Q4cO/fr1c329VatWwOTJkw3D6NSpEzBnzhzXty43HJmZmRUrVgS2bdt2+SXffvvtdW96VfK2bds+++yzjz/+eK1atVydU3Jy8rZt21w32rhxo2EY+/fvd/Vec+fOvdxCueKtWLHCFSMhIcEw3WAV4f0WEMm4osH68MMPDcPYtWuX6x93797t4f/eIuIfNEUoEhTy8vLsdnt2dnZ6ejpgt9tdP/J37NgBOJ3O+Pj4Pn36uJ7aW758+VUvr1Onzueff96+ffv+/fvfcccd69evd12kgDuWKVOmd+/ewKJFi1JTUzdu3BgdHX3//febv6nLmjVrpk6d+umnnx46dKh69er/+te/6tSp4wrQuHHj5s2bA/Xq1Wvfvj2wbt0616tsNtugQYOADh06xMTEAElJSeb/dRXh/V43ksuDDz4INGrUyNXpZmRkmE8lIiWItmkQCQpvv/32U089BZw7d65NmzZ79+6dNm3ae++95/oBHxoa6nQ6gRo1avTq1evyzNplycnJrVq1Sk1NbdOmTbdu3SpXruyuH7pSfHx8QkLCd999d/PNNzudzn79+rmGiEze1GX48OF9+vQJCQmJjo6++eabXZNrrhVUrh7FxfX3l1dWlS1b1jWABERGRgKue11mGAaQm5tr5PckdRHe73UjubiG0wDXHKKIBCo1WCLBJSoqqlOnTnv37t29ezfQoEEDICwsbM6cOTabLSUlZdeuXdfuAvXll1+mpqZ269Zt4cKFhmE0bNjQzL3atm1bp06djRs3RkREAI899pjr6yZv6lKrVq0WLVpc9cXGjRsDGzZsSE9Pj4yMzMvLW7Zs2eWvA5cuXdq2bdudd96Zm5vr+pbr2cmoqKiIiIicnJxjx45VrFhx69at+d60CO/3upFEJKjoVyiRoFOpUiV+G1np06ePa4F5v379xo4d26ZNmwcffPDa2TTXUvT9+/d/+eWXzz77rGtSzzUmVLZsWSAhIWHRokVXvcpms8XFxTmdzpUrVzZt2rRp06aur5u8aQHuu+8+V/PUsGHDYcOG3XrrrampqTfddFNcXNzlmm7dug0aNKhevXrHjh2LjIz84x//CISGhv7+978HOnToMGjQoJ49e+a7pVYR3q+ZSCISRKxdAiYi3nbtU4Qff/wxULFixdOnTxuGsXr16ttuu831gRAWFjZu3Li8vDxX5eVF37m5uffee6+rF2nTpo1rS6ouXboYhvH111+7JuPi4+ON/32qzjCM5ORk11cmTZp0ZaoCbnpV8stPEV7lyJEj99xzz+WPsttvvz0pKcn4bRl7WFjYyy+/XLp0aSA6OjoxMfHyC9etW+caLQsPD3/99derVq3KNYvci/Z+3UUyrljkfu7cOddXXFOimzZtKvx/UhEpAbSTu4jgdDoPHDiQnp7esGFD1whNvo4dO2az2a7d5dzhcJw9e7Zs2bIVKlTw+E0LdurUqV9//bVmzZq33HKL6yupqanR0dFhYWG5ubmZmZmHDx+uX7++a+XWlQ4dOlS5cuWCT90p2vu9NpKIBCE1WCISUK5ssKzOIiLBS2uwRERERDxMTxGKSECJiorav3+/l06DFhExSVOEIiIiIh6mKUIRERERD1ODJSIiIuJharBEREREPEwNloiIiIiHqcESERER8TA1WCIiIiIepgZLRERExMPUYImIiIh4mBosEREREQ9TgyUiIiLiYWqwRERERDxMDZaIiIiIh6nBEhEREfEwNVgiIiIiHqYGS0RERMTD1GCJiIiIeJgaLBEREREPU4MlIiIi4mFqsEREREQ8TA2WiIiIiIepwRIRERHxMDVYIiIiIh6mBktERETEw9RgiYiIiHiYGiwRERERD1ODJSIiIuJharBEREREPEwNloiIiIiHqcESERER8TA1WCIiIiIepgZLRERExMPUYImIiIh4mBosEREREQ9TgyUiIiLiYWqwRETIzMxMSUkp8st3797tuSwiEgjUYImIsG3btqeeeqrIL+/Ro4cHw4hIAFCDJSKSD6fTOWLEiFq1avXp0ycpKQn47rvvxowZ06FDh9q1a3/11VdOp3P48OH169cfNmyYYRjXvuSqeqvfkIj4VJjVAURE/NGmTZuSkpK2b99++PDhV1555ZtvvklPT581a9aaNWt27tz56quvRkZG/vzzz2vWrJk+fXp6evq1L+nVq9eV9b169bL6PYmI72gES0QkH0uWLBkwYEBUVNQdd9xx8ODBS5cuAQ899FD16tVjY2OPHj26bNmy+Pj4qlWrDho0KDQ09NqX5OTkXFlv9RsSEZ9SgyUiko/Dhw9XqVLF9fe5ubmuScCyZcsCNpsNOH78eNWqVV1fDA8Pz/clV9aLSFBRgyUiko/OnTsvX74cOHjwYFRUVPny5a8qiI2NTUxMBNatW5ednX3tS0qXLu3z1CLiL7QGS0QEYNWqVdWqVXP9/YcfftilS5dZs2bde++9O3funDZt2rX1Xbt2nTFjRrt27cLCwlwDV1e9xNV1iUhwsrnGvUVE5FonTpyIjIx0zfTl6/jx49WrV79yEvC6LxGRYKAGS0RERMTDtAZLRIKO0+kMDQ21+dDEiROtftMi4lNagyUiQSctLS0yMvLcuXNWBxGRgKURLBEJOufPn69UqZLVKUQkkKnBEpGgowZLRLxNDZaIBB01WCLibWqwRCToqMESEW9TgyUiQUcNloh4mxosEQk6586dU4MlIl6lBktEgo5G
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- There is also hlint integration enabled by default.\n",
"-- If you write sketchy code, it will tell you:\n",
"f :: Int -> Int\n",
"f x = x + 1\n",
"\n",
"-- Most warnings are orange...\n",
"f $ 3\n",
"\n",
"-- But more severe warnings are red.\n",
"putStrLn (show 3)\n",
"do\n",
" return 3"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
" <table class=\"suggestion-table\"> <tr class=\"suggestion-row\"> <td class=\"suggestion-cell\"> <div class=\"suggestion-name\"> Redundant $</div> </td> </tr> <tr class=\"suggestion-row\"> <td class=\"suggestion-cell\"> <div class=\"suggestion-warning\">Found:</div> <div class=\"highlight-code\" id=\"haskell\"> f $ 3\n",
"</div> </td> <td class=\"suggestion-cell\"> <div class=\"suggestion-warning\">Why Not:</div> <div class=\"highlight-code\" id=\"haskell\"> f 3\n",
"</div> </td> </tr> <tr class=\"suggestion-row\"> <td class=\"suggestion-cell\"> <div class=\"suggestion-name\"> Use print</div> </td> </tr> <tr class=\"suggestion-row\"> <td class=\"suggestion-cell\"> <div class=\"suggestion-error\">Found:</div> <div class=\"highlight-code\" id=\"haskell\"> putStrLn (show 3)\n",
"</div> </td> <td class=\"suggestion-cell\"> <div class=\"suggestion-error\">Why Not:</div> <div class=\"highlight-code\" id=\"haskell\"> print 3\n",
"</div> </td> </tr> <tr class=\"suggestion-row\"> <td class=\"suggestion-cell\"> <div class=\"suggestion-name\"> Redundant do</div> </td> </tr> <tr class=\"suggestion-row\"> <td class=\"suggestion-cell\"> <div class=\"suggestion-error\">Found:</div> <div class=\"highlight-code\" id=\"haskell\"> do return 3\n",
"</div> </td> <td class=\"suggestion-cell\"> <div class=\"suggestion-error\">Why Not:</div> <div class=\"highlight-code\" id=\"haskell\"> return 3\n",
"</div> </td> </tr> </table> "
],
"metadata": {},
"output_type": "display_data",
"text": [
"Line 3: Redundant $\n",
"Found:\n",
" f $ 3\n",
"\n",
"Why not:\n",
" f 3\n",
"Line 4: Use print\n",
"Found:\n",
" putStrLn (show 3)\n",
"\n",
"Why not:\n",
" print 3\n",
"Line 5: Redundant do\n",
"Found:\n",
" do return 3\n",
"\n",
"Why not:\n",
" return 3"
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"4"
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"3"
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"3"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- If hlint annoys you, though, you can turn it off.\n",
"-- Note that this only takes effect in the next cell execution.\n",
":hlint off"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- You could similarly use `:hlint on` to turn it back on.\n",
"f $ 3"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"4"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- If your code isn't running fast enough, you can just put it into a module.\n",
"module A.B where\n",
"\n",
"fib 0 = 1\n",
"fib 1 = 1\n",
"fib n = fib (n-1) + fib (n-2)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- The module is automatically imported unqualified.\n",
"-- Note that since a new module is imported, all previous\n",
"-- bound identifiers are now unbound.\n",
"print $ A.B.fib 20\n",
"print $ fib 20"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"10946"
]
},
{
"metadata": {},
"output_type": "display_data",
"text": [
"10946"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"-- But if you re-import it qualified, the previous import goes away.\n",
"import qualified A.B as Fib\n",
"\n",
"Fib.fib 20\n",
"fib 20"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"10946"
]
},
{
"html": [
"<span style='color: red; font-style: italic;'>Not in scope: `fib'<br/>Perhaps you meant `Fib.fib' (imported from A.B)</span>"
],
"metadata": {},
"output_type": "display_data",
"text": [
"Not in scope: `fib'\n",
"Perhaps you meant `Fib.fib' (imported from A.B)"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thanks!\n",
"---\n",
"\n",
"I hope you've enjoyed this little demo of **IHaskell**!\n",
"\n",
"All of this is running using [IPython notebook][http://ipython.org], communicating asynchronously with a language evaluator kernel written in pure Haskell. \n",
"\n",
"In addition to code cells, you can also type Markdown, and have it be displayed as HTML - just like I'm doing with this cell.\n",
"\n",
"I hope you find IHaskell useful, and please report any bugs or features requests [on Github](https://github.com/gibiansky/IHaskell/issues). If you have any comments, want to contribute, or just want to get in touch, don't hesitate to contact me at Andrew dot Gibiansky at Gmail."
]
}
],
"metadata": {}
}
]
}