CINXE.COM

Obfuscation - HaskellWiki

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr"> <head><script type="text/javascript" src="https://web-static.archive.org/_static/js/bundle-playback.js?v=7YQSqjSh" charset="utf-8"></script> <script type="text/javascript" src="https://web-static.archive.org/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="https://web-static.archive.org/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("https://wiki.haskell.org/Obfuscation","20170830203204","https://web.archive.org/","web","https://web-static.archive.org/_static/", "1504125124"); </script> <link rel="stylesheet" type="text/css" href="https://web-static.archive.org/_static/css/banner-styles.css?v=p7PEIJWi" /> <link rel="stylesheet" type="text/css" href="https://web-static.archive.org/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta name="generator" content="MediaWiki 1.19.14+dfsg-1"/> <link rel="shortcut icon" href="/web/20170830203204im_/https://wiki.haskell.org/wikistatic/favicon.ico"/> <link rel="search" type="application/opensearchdescription+xml" href="/web/20170830203204/https://wiki.haskell.org/opensearch_desc.php" title="HaskellWiki (en)"/> <link rel="EditURI" type="application/rsd+xml" href="https://wiki.haskell.org/api.php?action=rsd"/> <link rel="copyright" href="/web/20170830203204/https://wiki.haskell.org/HaskellWiki:Copyrights"/> <link rel="alternate" type="application/atom+xml" title="HaskellWiki Atom feed" href="/web/20170830203204/https://wiki.haskell.org/index.php?title=Special:RecentChanges&amp;feed=atom"/> <title>Obfuscation - HaskellWiki</title> <style type="text/css" media="screen, projection">/*<![CDATA[*/ @import "/web/20170830203204cs_/https://wiki.haskell.org/wikistatic/skins//common/shared.css?303"; @import "/web/20170830203204cs_/https://wiki.haskell.org/wikistatic/skins//hawiki/main.css?303"; /*]]>*/</style> <link rel="stylesheet" type="text/css" media="print" href="/web/20170830203204cs_/https://wiki.haskell.org/wikistatic/skins//common/commonPrint.css?303"/> <!--[if lt IE 5.5000]><style type="text/css">@import "/wikistatic/skins//hawiki/IE50Fixes.css?303";</style><![endif]--> <!--[if IE 5.5000]><style type="text/css">@import "/wikistatic/skins//hawiki/IE55Fixes.css?303";</style><![endif]--> <!--[if IE 6]><style type="text/css">@import "/wikistatic/skins//hawiki/IE60Fixes.css?303";</style><![endif]--> <!--[if IE 7]><style type="text/css">@import "/wikistatic/skins//hawiki/IE70Fixes.css?303";</style><![endif]--> <!--[if lte IE 7]><script type="text/javascript" src="/wikistatic/skins//hawiki/IEFixes.js?303"></script> <meta http-equiv="imagetoolbar" content="no" /><![endif]--> <script type="text/javascript"> var isMSIE55 = (window.showModalDialog && window.clipboardData && window.createPopup); /*alert("test: " + isMSIE55);*/</script> <script>if(window.mw){ mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Obfuscation","wgTitle":"Obfuscation","wgCurRevisionId":20988,"wgArticleId":1509,"wgIsArticle":true,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Idioms","Contests"],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgRelevantPageName":"Obfuscation","wgRestrictionEdit":[],"wgRestrictionMove":[]}); }</script> <script type="text/javascript" src="/web/20170830203204js_/https://wiki.haskell.org/wikistatic/skins//common/wikibits.js?303"><!-- wikibits js --></script> <!-- Head Scripts --> <script src="https://web.archive.org/web/20170830203204js_/https://wiki.haskell.org/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=hawiki&amp;*"></script> <script>if(window.mw){ mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Obfuscation","wgTitle":"Obfuscation","wgCurRevisionId":20988,"wgArticleId":1509,"wgIsArticle":true,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Idioms","Contests"],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgRelevantPageName":"Obfuscation","wgRestrictionEdit":[],"wgRestrictionMove":[]}); }</script><script>if(window.mw){ mw.loader.implement("user.options",function($){mw.user.options.set({"ccmeonemails":0,"cols":80,"date":"default","diffonly":0,"disablemail":0,"disablesuggest":0,"editfont":"default","editondblclick":0,"editsection":1,"editsectiononrightclick":0,"enotifminoredits":0,"enotifrevealaddr":0,"enotifusertalkpages":1,"enotifwatchlistpages":0,"extendwatchlist":0,"externaldiff":0,"externaleditor":0,"fancysig":0,"forceeditsummary":0,"gender":"unknown","hideminor":0,"hidepatrolled":0,"highlightbroken":1,"imagesize":2,"justify":0,"math":1,"minordefault":0,"newpageshidepatrolled":0,"nocache":0,"noconvertlink":0,"norollbackdiff":0,"numberheadings":1,"previewonfirst":0,"previewontop":1,"quickbar":5,"rcdays":7,"rclimit":50,"rememberpassword":0,"rows":25,"searchlimit":20,"showhiddencats":0,"showjumplinks":1,"shownumberswatching":1,"showtoc":1,"showtoolbar":1,"skin":"hawiki","stubthreshold":0,"thumbsize":2,"underline":2,"uselivepreview":0,"usenewrc":0,"watchcreations":0,"watchdefault":0,"watchdeletion":0, "watchlistdays":3,"watchlisthideanons":0,"watchlisthidebots":0,"watchlisthideliu":0,"watchlisthideminor":0,"watchlisthideown":0,"watchlisthidepatrolled":0,"watchmoves":0,"wllimit":250,"variant":"en","language":"en","searchNs0":true,"searchNs1":false,"searchNs2":false,"searchNs3":false,"searchNs4":false,"searchNs5":false,"searchNs6":false,"searchNs7":false,"searchNs8":false,"searchNs9":false,"searchNs10":false,"searchNs11":false,"searchNs12":false,"searchNs13":false,"searchNs14":false,"searchNs15":false});;},{},{});mw.loader.implement("user.tokens",function($){mw.user.tokens.set({"editToken":"+\\","watchToken":false});;},{},{}); /* cache key: wikidb_haskell:resourceloader:filter:minify-js:7:befcdb5e3b24ff89f900613de9ed4ea3 */ }</script> <script>if(window.mw){ mw.loader.load(["mediawiki.page.startup","mediawiki.legacy.wikibits","mediawiki.legacy.ajax"]); }</script><style type="text/css">/*<![CDATA[*/ .source-haskell {line-height: normal;} .source-haskell li, .source-haskell pre { line-height: normal; border: 0px none white; } /** * GeSHi Dynamically Generated Stylesheet * -------------------------------------- * Dynamically generated stylesheet for haskell * CSS class: source-haskell, CSS id: * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2014 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) * -------------------------------------- */ .haskell.source-haskell .de1, .haskell.source-haskell .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;} .haskell.source-haskell {font-family:monospace;} .haskell.source-haskell .imp {font-weight: bold; color: red;} .haskell.source-haskell li, .haskell.source-haskell .li1 {font-weight: normal; vertical-align:top;} .haskell.source-haskell .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;} .haskell.source-haskell .li2 {font-weight: bold; vertical-align:top;} .haskell.source-haskell .kw1 {color: #06c; font-weight: bold;} .haskell.source-haskell .kw2 {color: #06c; font-weight: bold;} .haskell.source-haskell .kw3 {font-weight: bold;} .haskell.source-haskell .kw4 {color: #cccc00; font-weight: bold;} .haskell.source-haskell .kw5 {color: maroon; font-weight: bold;} .haskell.source-haskell .co1 {color: #5d478b; font-style: italic;} .haskell.source-haskell .co2 {color: #339933; font-weight: bold;} .haskell.source-haskell .co3 {color: #5d478b; font-style: italic;} .haskell.source-haskell .coMULTI {color: #5d478b; font-style: italic;} .haskell.source-haskell .es0 {background-color: #3cb371; font-weight: bold;} .haskell.source-haskell .br0 {color: green;} .haskell.source-haskell .sy0 {color: #339933; font-weight: bold;} .haskell.source-haskell .st0 {color: #3cb371;} .haskell.source-haskell .nu0 {color: red;} .haskell.source-haskell .me1 {color: #060;} .haskell.source-haskell .ln-xtra, .haskell.source-haskell li.ln-xtra, .haskell.source-haskell div.ln-xtra {background-color: #ffc;} .haskell.source-haskell span.xtra { display:block; } /*]]>*/ </style> </head> <body class="mediawiki ltr ns-0 ns-subject page-Obfuscation skin-hawiki"> <div id="topbar" class="noprint"> <div class="portlet noprint" id="p-personal"> <h5>Personal tools</h5> <div class="pBody"> <ul><li><a class="homebutton" href="/web/20170830203204/https://wiki.haskell.org/Haskell">Home</a></li> <li id="pt-login"><a href="/web/20170830203204/https://wiki.haskell.org/index.php?title=Special:UserLogin&amp;returnto=Obfuscation">Log in</a></li> </ul> </div> </div> <div id="p-search"> <div id="searchBody" class="pBody"> <form action="/web/20170830203204/https://wiki.haskell.org/index.php" id="searchform"><div> <input type="hidden" name="title" value="Special:Search"/> <input id="searchInput" name="search" type="text" value=""/> <input type="submit" name="go" class="searchButton" id="searchGoButton" value="Go"/>&nbsp; <input type="submit" name="fulltext" class="searchButton" id="mw-searchButton" value="Search"/> </div></form> </div> </div> </div> <div id="globalWrapper"> <div class="portlet" id="p-logo"> <a style="background-image: url(/web/20170830203204im_/https://wiki.haskell.org/wikistatic/haskellwiki_logo.png);" href="/web/20170830203204/https://wiki.haskell.org/Haskell"></a> </div> <div id="column-content"> <div id="notice-area" class="noprint"> <!-- ?php $this->data['sitenotice'] = 'This is a test instance. Do not edit, your changes will be lost.'; ? --> </div> <div id="content-wrapper"> <div id="p-cactions" class="portlet noprint"> <h5>Views</h5> <div class="pBody"> <ul> <li id="ca-nstab-main" class="selected"><a href="/web/20170830203204/https://wiki.haskell.org/Obfuscation">Page</a></li> <li id="ca-talk"><a href="/web/20170830203204/https://wiki.haskell.org/Talk:Obfuscation">Discussion</a></li> <li id="ca-viewsource"><a href="/web/20170830203204/https://wiki.haskell.org/index.php?title=Obfuscation&amp;action=edit">View source</a></li> <li id="ca-history"><a href="/web/20170830203204/https://wiki.haskell.org/index.php?title=Obfuscation&amp;action=history">History</a></li> </ul> </div> </div> <div id="content"> <a name="top" id="top"></a> <h1 id="firstHeading" class="firstHeading">Obfuscation</h1> <div id="bodyContent"> <h3 id="siteSub">From HaskellWiki</h3> <div id="contentSub"></div> <div id="jump-to-nav">Jump to: <a href="#column-one">navigation</a>, <a href="#searchInput">search</a></div> <!-- start content --> <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><p>Haskell is (perhaps surprisingly) an excellent language for code obfuscation. There have been three Haskell obfuscation contests: </p> <ul><li> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170830203204/http://www.haskell.org/pipermail/haskell/2004-August/014387.html">1993 Bottomth Obfuscation Haskell Contest</a> </li><li> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170830203204/http://web.archive.org/web/20060103040156/http://iohc.mgoetze.net/">2003 Zeroth Obfuscated Haskell Contest</a> </li><li> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170830203204/http://web.archive.org/web/20060107141532/http://www.scannedinavian.org/iohcc/succzeroth-2004/">2004 Succ Zeroth Obfuscated Haskell Contest</a> (2004 IOHCC <a href="/web/20170830203204/https://wiki.haskell.org/Obfuscation/IOHCC_2004" title="Obfuscation/IOHCC 2004">announcement</a>) </li></ul> <p>The ability to use symbols for identifiers helps a lot of course, as does suspending the use of layout. <a href="/web/20170830203204/https://wiki.haskell.org/Pointfree" title="Pointfree">Pointfree</a> style is also an excellent help. Use of strange monads and <a href="/web/20170830203204/https://wiki.haskell.org/Type_arithmetic" title="Type arithmetic">type arithmetic</a> can all be very confusing. Finally, Haskell's clean semantics makes refactoring code (semi-)mechanical, leading to some interesting obfuscated encodings (one can replace most Haskell keywords with lambda abstractions, for example). </p> <h2> <span class="mw-headline" id="Example"> Example </span></h2> <p>The following illustrates how, by turning off layout, rewriting keywords (let, case, where) as lambdas, and using symbols for identifiers (in this case multiple '?' characters), Haskell may be highly obfuscated. </p> <div dir="ltr" class="mw-geshi mw-content-ltr"><div class="haskell source-haskell"><pre class="de1"> <span class="co1">--------------------------------------------</span> <span class="kw1">module</span> Main <span class="kw1">where</span><span class="br0">&#123;</span><span class="kw1">import</span> List;<span class="kw1">import</span> System; <span class="kw1">import</span> Data.HashTable <span class="kw1">as</span> H;<span class="br0">&#40;</span><span class="sy0">???????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="kw3">concat</span> <span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">??????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span>groupBy<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ;<span class="br0">&#40;</span><span class="sy0">??????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">??????????</span> <span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">tail</span><span class="br0">&#41;</span>.<span class="br0">&#40;</span><span class="sy0">???????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span> <span class="sy0">??????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">?????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">??</span><span class="br0">&#41;</span> <span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#91;</span>' '<span class="br0">&#93;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">??????????????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span>hashString<span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">?</span><span class="br0">&#41;</span> <span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">&gt;&gt;=</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">???????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">?????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">?</span><span class="br0">&#40;</span><span class="sy0">\</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="sy0">????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">==</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">??????????????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">?</span><span class="br0">&#40;</span><span class="sy0">\</span><span class="br0">&#40;</span><span class="br0">&#40;</span> <span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">??????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???????????????</span> <span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">&gt;&gt;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">?????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">?</span><span class="br0">&#40;</span> <span class="sy0">\</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">??????????????????????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="br0">&#40;</span> <span class="sy0">???????????????????????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">??</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="sy0">????????????</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="st0">&quot;usage f dic out&quot;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">?????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="sy0">??????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="sy0">????????????????????</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="sy0">==</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">?????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="sy0">=</span> <span class="br0">&#40;</span>toList<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">??????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">??????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw3">snd</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ;<span class="br0">&#40;</span><span class="sy0">??????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">mapM</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw3">lines</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">???????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span> <span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="sy0">?????????</span> <span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">unlines</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span> <span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span> new<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span>main<span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???????????</span><span class="br0">&#41;</span><span class="sy0">?</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">\</span> <span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???????????????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="br0">&#40;</span><span class="sy0">???????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span> <span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>sort<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">??</span><span class="br0">&#41;</span><span class="sy0">++</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">???????????</span><span class="br0">&#41;</span> <span class="sy0">=</span><span class="br0">&#40;</span>getArgs<span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">print</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span> <span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">??????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">map</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span> H.insert<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">?????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<span class="br0">&#40;</span><span class="sy0">?????????</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">writeFile</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">????</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ;<span class="br0">&#40;</span><span class="sy0">?????????????</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">readFile</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="sy0">???</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span> <span class="co1">--------------------------------------------</span></pre></div></div> <!-- NewPP limit report Preprocessor node count: 6/1000000 Post鈥恊xpand include size: 0/2097152 bytes Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> <!-- Saved in parser cache with key wikidb_haskell:pcache:idhash:1509-0!*!0!*!*!*!* and timestamp 20170830053256 --> </div><div class="printfooter"> Retrieved from "<a href="https://web.archive.org/web/20170830203204/https://wiki.haskell.org/index.php?title=Obfuscation&amp;oldid=20988">https://wiki.haskell.org/index.php?title=Obfuscation&amp;oldid=20988</a>"</div> <div id="catlinks" class="catlinks"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/web/20170830203204/https://wiki.haskell.org/Special:Categories" title="Special:Categories">Categories</a>: <ul><li><a href="/web/20170830203204/https://wiki.haskell.org/Category:Idioms" title="Category:Idioms">Idioms</a></li><li><a href="/web/20170830203204/https://wiki.haskell.org/Category:Contests" title="Category:Contests">Contests</a></li></ul></div></div> <!-- end content --> <div class="visualClear"></div> </div> </div> </div></div> <div id="column-one"> <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script> <div class="generated-sidebar portlet" id="p-navigation"> <h5>Navigation</h5> <div class="pBody"> <ul> <li id="n-mainpage"><a href="/web/20170830203204/https://wiki.haskell.org/Haskell">Haskell</a></li> <li id="n-portal"><a href="/web/20170830203204/https://wiki.haskell.org/HaskellWiki:Community">Wiki community</a></li> <li id="n-recentchanges"><a href="/web/20170830203204/https://wiki.haskell.org/Special:RecentChanges">Recent changes</a></li> <li id="n-randompage"><a href="/web/20170830203204/https://wiki.haskell.org/Special:Random">Random page</a></li> </ul> </div> </div> <div class="portlet" id="p-tb"> <h5>Tools</h5> <div class="pBody"> <ul> <li id="t-whatlinkshere"><a href="/web/20170830203204/https://wiki.haskell.org/Special:WhatLinksHere/Obfuscation">What links here</a></li> <li id="t-recentchangeslinked"><a href="/web/20170830203204/https://wiki.haskell.org/Special:RecentChangesLinked/Obfuscation">Related changes</a></li> <li id="t-specialpages"><a href="/web/20170830203204/https://wiki.haskell.org/Special:SpecialPages">Special pages</a></li> <li id="t-print"><a href="/web/20170830203204/https://wiki.haskell.org/index.php?title=Obfuscation&amp;printable=yes" rel="alternate">Printable version</a></li> <li id="t-permalink"><a href="/web/20170830203204/https://wiki.haskell.org/index.php?title=Obfuscation&amp;oldid=20988">Permanent link</a></li> </ul> </div> </div> </div><!-- end of the left (by default at least) column --> <div class="visualClear"></div> <div id="footer"> <div id="f-poweredbyico"><a href="//web.archive.org/web/20170830203204/https://www.mediawiki.org/"><img src="/web/20170830203204im_/https://wiki.haskell.org/wikistatic/skins//common/images/poweredby_mediawiki_88x31.png" height="31" width="88" alt="Powered by MediaWiki"/></a></div> <ul id="f-list"> <li id="lastmod"> This page was last modified on 17 May 2008, at 18:50.</li> <li id="copyright">Recent content is available under <a href="/web/20170830203204/https://wiki.haskell.org/HaskellWiki:Copyrights" title="HaskellWiki:Copyrights">a simple permissive license</a>.</li> <li id="privacy"><a href="/web/20170830203204/https://wiki.haskell.org/HaskellWiki:Privacy_policy" title="HaskellWiki:Privacy policy">Privacy policy</a></li> <li id="about"><a href="/web/20170830203204/https://wiki.haskell.org/HaskellWiki:About" title="HaskellWiki:About">About HaskellWiki</a></li> <li id="disclaimer"><a href="/web/20170830203204/https://wiki.haskell.org/HaskellWiki:General_disclaimer" title="HaskellWiki:General disclaimer">Disclaimers</a></li> </ul> </div> </div> <script>if(window.mw){ mw.loader.load(["mediawiki.user","mediawiki.page.ready"], null, true); }</script> <script src="https://web.archive.org/web/20170830203204js_/https://wiki.haskell.org/load.php?debug=false&amp;lang=en&amp;modules=site&amp;only=scripts&amp;skin=hawiki&amp;*"></script> <!-- Served in 0.095 secs. --><script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-83290513-2']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://web.archive.org/web/20170830203204/https://ssl' : 'https://web.archive.org/web/20170830203204/http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> </body></html> <!-- FILE ARCHIVED ON 20:32:04 Aug 30, 2017 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 12:06:17 Feb 17, 2025. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.762 exclusion.robots: 0.051 exclusion.robots.policy: 0.035 esindex: 0.015 cdx.remote: 5.862 LoadShardBlock: 183.703 (3) PetaboxLoader3.datanode: 157.234 (4) PetaboxLoader3.resolve: 169.559 (2) load_resource: 222.765 -->

Pages: 1 2 3 4 5 6 7 8 9 10