I'm working on modernizing Rosetta Code's infrastructure. Starting with communications. Please accept this time-limited open invite to RC's Slack.. --Michael Mol (talk) 20:59, 30 May 2020 (UTC)

Execute Brain****/Haskell is an implementation of Brainf***. Other implementations of Brainf***.
Execute Brain****/Haskell is part of RCBF. You may find other members of RCBF at Category:RCBF.

Quick implementation of a Brainfuck interpreter in Haskell.

Pairs of lists are used to implement both the two-side infinite band of cells, and the program storage. This means that it can also work on infinite Brainfuck programs (which could be generated lazily).

In functional style, run interprets a Brainfuck program as a function from an Integer list (inputs) to an Integer list (outputs). This can be easily turned into a real dialog with a user via stdin and stdout.

A more efficient implementation could for example only admit well-bracketed brainfuck programs, and parse bracket blocks first, to replace the matchLeft and matchRight which need linear time.

`module BF where moveLeft  (x:l,r) = (l,x:r)moveRight (l,x:r) = (x:l,r)  matchLeft d@('[':_,_) = dmatchLeft d@(']':_,_) = matchLeft \$ moveLeft \$ matchLeft \$ moveLeft \$ dmatchLeft d           = matchLeft \$ moveLeft \$ d matchRight d@(_,']':_) = moveRight \$ dmatchRight d@(_,'[':_) = matchRight \$ matchRight \$ moveRight \$ dmatchRight d           = matchRight \$ moveRight  \$ d pad ([],[]) = (,)pad ([],r)  = (,r)pad (l,[])  = (l,)pad d       = d modify f (l,x:r) = (l,(f x):r) exec :: (String, String) -> ([Integer], [Integer]) -> [Integer] -> [Integer]exec   (_,[])    _         _  = []exec p@(_,'>':_) d         cs = exec (moveRight p) (pad \$ moveRight \$ d) csexec p@(_,'<':_) d         cs = exec (moveRight p) (pad \$ moveLeft  \$ d) csexec p@(_,'+':_) d         cs = exec (moveRight p) (modify (+ 1) d) csexec p@(_,'-':_) d         cs = exec (moveRight p) (modify (subtract 1) d) csexec p@(_,',':_) d     (c:cs) = exec (moveRight p) (modify (const c) d) csexec p@(_,'.':_) d@(_,x:_) cs = x : exec (moveRight p) d csexec p@(_,'[':_) d@(_,0:_) cs = exec (matchRight \$ moveRight \$ p) d csexec p@(_,'[':_) d         cs = exec (moveRight p) d csexec p@(_,']':_) d@(_,0:_) cs = exec (moveRight p) d csexec p@(_,']':_) d         cs = exec (matchLeft \$ moveLeft \$ p) d cs run :: String -> [Integer] -> [Integer]run s = exec ([],s) (,) dialog :: String -> IO ()dialog s = mapM_ print . run s . map read . lines =<< getContents `
(This version compiles with GHC and will run if loaded into ghci using ':load BF')

Example session:

```: *Main> dialog ",[>+<-].>."
: ''5''
: 0
: 5
```