Execute HQ9+/Haskell: Difference between revisions
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
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.
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+.
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, "