summaryrefslogtreecommitdiff
path: root/gemfeed/2010-04-09-standard-ml-and-haskell.html
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2023-04-07 00:49:19 +0300
committerPaul Buetow <paul@buetow.org>2023-04-07 00:49:19 +0300
commit30fc4e8f74315a92aaec36dfb9a8d4efa0a21791 (patch)
tree97ef2b26fd54a366d72f5289ba11ea311f8a0173 /gemfeed/2010-04-09-standard-ml-and-haskell.html
parent5c9e3886de0f9041e4a6fb6fea9917e29a8fbd76 (diff)
exact style
Diffstat (limited to 'gemfeed/2010-04-09-standard-ml-and-haskell.html')
-rw-r--r--gemfeed/2010-04-09-standard-ml-and-haskell.html82
1 files changed, 58 insertions, 24 deletions
diff --git a/gemfeed/2010-04-09-standard-ml-and-haskell.html b/gemfeed/2010-04-09-standard-ml-and-haskell.html
index 13f18715..dcad4602 100644
--- a/gemfeed/2010-04-09-standard-ml-and-haskell.html
+++ b/gemfeed/2010-04-09-standard-ml-and-haskell.html
@@ -8,20 +8,29 @@
<link rel="stylesheet" href="style-override.css" />
</head>
<body>
-<h1>Standard ML and Haskell</h1>
-<p class="quote"><i>Published at 2010-04-09T22:57:36+01:00</i></p>
-<p>I am currently looking into the functional programming language Standard ML (aka SML). The purpose is to refresh my functional programming skills and to learn something new too. Since I already knew a little Haskell, I could not help myself, and I also implemented the same exercises in Haskell.</p>
-<p>As you will see, SML and Haskell are very similar (at least when it comes to the basics). However, the syntax of Haskell is a bit more "advanced". Haskell utilizes fewer keywords (e.g. no val, end, fun, fn ...). Haskell also allows to write down the function types explicitly. What I have been missing in SML so far is the so-called pattern guards. Although this is a very superficial comparison for now, so far, I like Haskell more than SML. Nevertheless, I thought it would be fun to demonstrate a few simple functions of both languages to show off the similarities. </p>
-<p>Haskell is also a "pure functional" programming language, whereas SML also makes explicit use of imperative concepts. I am by far not a specialist in either of these languages, but here are a few functions implemented in both SML and Haskell:</p>
-<h2>Defining a multi-data type</h2>
-<p>Standard ML:</p>
+<h1 style='display: inline'>Standard ML and Haskell</h1><br />
+<br />
+<span class=quote>Published at 2010-04-09T22:57:36+01:00</span><br />
+<br />
+<span>I am currently looking into the functional programming language Standard ML (aka SML). The purpose is to refresh my functional programming skills and to learn something new too. Since I already knew a little Haskell, I could not help myself, and I also implemented the same exercises in Haskell.</span><br />
+<br />
+<span>As you will see, SML and Haskell are very similar (at least when it comes to the basics). However, the syntax of Haskell is a bit more "advanced". Haskell utilizes fewer keywords (e.g. no val, end, fun, fn ...). Haskell also allows to write down the function types explicitly. What I have been missing in SML so far is the so-called pattern guards. Although this is a very superficial comparison for now, so far, I like Haskell more than SML. Nevertheless, I thought it would be fun to demonstrate a few simple functions of both languages to show off the similarities. </span><br />
+<br />
+<span>Haskell is also a "pure functional" programming language, whereas SML also makes explicit use of imperative concepts. I am by far not a specialist in either of these languages, but here are a few functions implemented in both SML and Haskell:</span><br />
+<br />
+<h2 style='display: inline'>Defining a multi-data type</h2><br />
+<br />
+<span>Standard ML:</span><br />
+<br />
<pre>
datatype ’a multi
= EMPTY
| ELEM of ’a
| UNION of ’a multi * ’a multi
</pre>
-<p>Haskell:</p>
+<br />
+<span>Haskell:</span><br />
+<br />
<pre>
data (Eq a) =&gt; Multi a
= Empty
@@ -29,8 +38,11 @@ data (Eq a) =&gt; Multi a
| Union (Multi a) (Multi a)
deriving Show
</pre>
-<h2>Processing a multi</h2>
-<p>Standard ML:</p>
+<br />
+<h2 style='display: inline'>Processing a multi</h2><br />
+<br />
+<span>Standard ML:</span><br />
+<br />
<pre>
fun number (EMPTY) _ = 0
| number (ELEM x) w = if x = w then 1 else 0
@@ -39,7 +51,9 @@ fun test_number w = number (UNION (EMPTY, \
UNION (ELEM 4, UNION (ELEM 6, \
UNION (UNION (ELEM 4, ELEM 4), EMPTY))))) w
</pre>
-<p>Haskell:</p>
+<br />
+<span>Haskell:</span><br />
+<br />
<pre>
number Empty _ = 0
number (Elem x) w = if x == w then 1 else 0
@@ -47,8 +61,11 @@ test_number w = number (Union Empty \
(Union (Elem 4) (Union (Elem 6) \
(Union (Union (Elem 4) (Elem 4)) Empty)))) w
</pre>
-<h2>Simplify function</h2>
-<p>Standard ML:</p>
+<br />
+<h2 style='display: inline'>Simplify function</h2><br />
+<br />
+<span>Standard ML:</span><br />
+<br />
<pre>
fun simplify (UNION (x,y)) =
let fun is_empty (EMPTY) = true | is_empty _ = false
@@ -64,7 +81,9 @@ fun simplify (UNION (x,y)) =
end
| simplify x = x
</pre>
-<p>Haskell:</p>
+<br />
+<span>Haskell:</span><br />
+<br />
<pre>
simplify (Union x y)
| (isEmpty x’) &amp;&amp; (isEmpty y’) = Empty
@@ -78,8 +97,11 @@ simplify (Union x y)
y’ = simplify y
simplify x = x
</pre>
-<h2>Delete all</h2>
-<p>Standard ML:</p>
+<br />
+<h2 style='display: inline'>Delete all</h2><br />
+<br />
+<span>Standard ML:</span><br />
+<br />
<pre>
fun delete_all m w =
let fun delete_all’ (ELEM x) = if x = w then EMPTY else ELEM x
@@ -88,7 +110,9 @@ fun delete_all m w =
in simplify (delete_all’ m)
end
</pre>
-<p>Haskell:</p>
+<br />
+<span>Haskell:</span><br />
+<br />
<pre>
delete_all m w = simplify (delete_all’ m)
where
@@ -96,8 +120,11 @@ delete_all m w = simplify (delete_all’ m)
delete_all’ (Union x y) = Union (delete_all’ x) (delete_all’ y)
delete_all’ x = x
</pre>
-<h2>Delete one</h2>
-<p>Standard ML:</p>
+<br />
+<h2 style='display: inline'>Delete one</h2><br />
+<br />
+<span>Standard ML:</span><br />
+<br />
<pre>
fun delete_one m w =
let fun delete_one’ (UNION (x,y)) =
@@ -115,7 +142,9 @@ fun delete_one m w =
in simplify m’
end
</pre>
-<p>Haskell:</p>
+<br />
+<span>Haskell:</span><br />
+<br />
<pre>
delete_one m w = do
let (m’, _) = delete_one’ m
@@ -131,8 +160,11 @@ delete_one m w = do
if x == w then (Empty, True) else (Elem x, False)
delete_one’ x = (x, False)
</pre>
-<h2>Higher-order functions</h2>
-<p>The first line is always the SML code, the second line the Haskell variant:</p>
+<br />
+<h2 style='display: inline'>Higher-order functions</h2><br />
+<br />
+<span>The first line is always the SML code, the second line the Haskell variant:</span><br />
+<br />
<pre>
fun make_map_fn f1 = fn (x,y) =&gt; f1 x :: y
make_map_fn f1 = \x y -&gt; f1 x : y
@@ -146,8 +178,10 @@ my_map f l = foldr (make_map_fn f) [] l
fun my_filter f l = foldr (make_filter_fn f) [] l
my_filter f l = foldr (make_filter_fn f) [] l
</pre>
-<p>E-Mail your comments to hi@paul.cyou :-)</p>
-<a class="textlink" href="../">Back to the main site</a><br />
+<br />
+<span>E-Mail your comments to hi@paul.cyou :-)</span><br />
+<br />
+<a class=textlink href='../'>Back to the main site</a><br />
<p class="footer">
Generated with <a href="https://codeberg.org/snonux/gemtexter">Gemtexter</a> |
served by <a href="https://www.OpenBSD.org">OpenBSD</a>/<a href="https://man.openbsd.org/httpd.8">httpd(8)</a> |