Edward Z. Yang ezyang at MIT.EDU
Thu Mar 26 23:57:19 EDT 2009

```Hello all,

As my first foray into the wonderful world of Haskell programming, I
wrote a simple program that solves Laplace equations. The program is 44
lines, and I would greatly appreciate comments on how I could make it

Cheers,
Edward

import Data.Array

data Node = Node {
isBoundary :: Bool,
value :: Double
}

instance Show Node where
show (Node True value)  = show value ++ "*"
show (Node False value) = show value

blankArray :: Ix i => (i, i) -> a -> Array i a
blankArray (a, b) x = array (a, b) [(i, x) | i <- range (a, b)]

fillBox :: Ix i => (i, i) -> a -> Array i a -> Array i a
fillBox (a, b) value m = m // [(i, value) | i <- range(a, b)]

average :: Fractional a => [a] -> a
average list = sum list / fromIntegral (length list)

solve :: Array (Integer, Integer) Node -> Array (Integer, Integer) Node
solve m =
if maximum deltas > 0.0001
then solve n
else n
where
n = array (min, max) [(i, solveNode i) | i <- range(min, max)]
deltas = map delta \$ zip (values m) (values n)
delta (x, y) = abs (x - y)
values a = map value \$ elems a
(min, max) = bounds m
solveNode (a, b) =
if isBoundary \$ node
then node
else averageNode
where
node = m ! (a, b)
averageNode = Node False \$
average [value \$ m ! i | i <- [(a+1,b),(a-1,b),(a,b+1),(a,b-1)]]

myArray =
fillBox    ((3,3), (5,5)) (Node True 100)
\$ fillBox    ((1,1), (8,8)) (Node False 0)
\$ blankArray ((0,0), (9,9)) (Node True 0)

```