Execute HQ9+/Haskell: Difference between revisions
Content added Content deleted
m (moved RCHQ9+/Haskell to Execute HQ9+/Haskell) |
m (Fixed syntax highlighting.) |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{implementation|HQ9+}}{{collection|RCHQ9+}} |
{{implementation|HQ9+}}{{collection|RCHQ9+}} |
||
This [[HQ9+]] interpreter is written in [[Haskell]]. |
This [[HQ9+]] interpreter is written in [[Haskell]]. |
||
We use [https://hackage.haskell.org/package/base-4.11.1.0/docs/Data-Traversable.html#v:mapAccumR mapAccumR] to maintain the accumulator. |
|||
⚫ | |||
However, the specification doesn't say what to do with said accumulator on completion. |
|||
<syntaxhighlight lang="haskell">module Main where |
|||
⚫ | |||
main = interact hq9p |
|||
import Data.List -- for concat |
|||
import Data.Traversable -- for mapAccumR |
|||
main :: IO () |
|||
main = do |
|||
⚫ | |||
s <- getLine |
|||
⚫ | |||
putStrLn (snd (hq9p s)) |
|||
run 'q' = source |
|||
⚫ | |||
hq9p :: String -> (Int,String) |
|||
⚫ | |||
⚫ | |||
-- Obviously, the final case works just fine for '+'. |
|||
where |
|||
fin (acc,log) = (acc,concat log) |
|||
run acc ch = case ch of |
|||
⚫ | |||
'q' -> (acc,src) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
bottles :: String |
bottles :: String |
||
bottles = |
bottles = [99, 98 .. 0] >>= beers |
||
where |
|||
[up (bob n) ++ wall ++ ", " ++ bob n ++ ".\n" ++ |
|||
beers n = unlines [ |
|||
pass n ++ bob (n - 1) ++ wall ++ ".\n\n" | |
|||
n |
bob n ++ " on the wall, " ++ bob n ++ ".", |
||
pass n ++ bob (n - 1) ++ " on the wall.\n"] |
|||
bob n = |
|||
let nu = case n of { (-1) -> "99"; 0 -> "No more"; n -> show n; } |
|||
s = if n == 1 then "" else "s" |
|||
in nu ++ " bottle" ++ s ++ " of beer" |
|||
pass n = case n of |
|||
0 -> "Go to the store and buy some more, " |
|||
_ -> "Take one down and pass it around, "</syntaxhighlight> |
|||
⚫ | |||
s _ = "s"</lang> |
Latest revision as of 10:15, 1 September 2022
Execute HQ9+/Haskell is an implementation of HQ9+.
Other implementations of HQ9+.
Execute HQ9+/Haskell is part of RCHQ9+. You may find other members of RCHQ9+ at Category:RCHQ9+.
This HQ9+ interpreter is written in Haskell. We use mapAccumR to maintain the accumulator. However, the specification doesn't say what to do with said accumulator on completion.
module Main where
import Data.Char (toLower, toUpper)
import Data.List -- for concat
import Data.Traversable -- for mapAccumR
main :: IO ()
main = do
s <- getLine
putStrLn (snd (hq9p s))
hq9p :: String -> (Int,String)
hq9p src = fin $ mapAccumR run 0 $ map toLower src
where
fin (acc,log) = (acc,concat log)
run acc ch = case ch of
'h' -> (acc,"Hello, world!")
'q' -> (acc,src)
'9' -> (acc,bottles)
'+' -> (acc + 1,"")
'_' -> (acc,"")
bottles :: String
bottles = [99, 98 .. 0] >>= beers
where
beers n = unlines [
bob n ++ " on the wall, " ++ bob n ++ ".",
pass n ++ bob (n - 1) ++ " on the wall.\n"]
bob n =
let nu = case n of { (-1) -> "99"; 0 -> "No more"; n -> show n; }
s = if n == 1 then "" else "s"
in nu ++ " bottle" ++ s ++ " of beer"
pass n = case n of
0 -> "Go to the store and buy some more, "
_ -> "Take one down and pass it around, "