TinCan (Esolang) Interpreter in Haskell
I'd rewrite toToken a slight bit:

toToken :: String -&gt; Token
toToken [t]
   | isAsciiUpper t = Variable t
   | t == '$' = Dollar
   | t == '@' = At
   | t == '&amp;' = Ampersand
toToken str = Value $ read str


Notice how I'm handling the single character string cases first and that this is much less indented. I've also omitted the explicit error message you have and eliminated the explicit type-signature.

This saves on vertical indentation and just reads a bit cleaner to me.

let's have a look at executeLine

executeLine :: Program -&gt; (Token, Token, Token) -&gt; Program
executeLine p (a,(Variable b), c)
    | pushToStack = jump (currentLine p + 1) $ push diff $ updateVariable p b diff
    | (diff &lt;= 0) = jump address $ updateVariable p b diff
    | otherwise = jump (currentLine p + 1) $ updateVariable p b diff
    where
        diff = value - differential
        differential = tokenToInt p a
        value = getVariable p b
        pushToStack = address == -1
        address = tokenToInt p c
executeLine _ _ = error "Could not execute line."


This again removes indentation reads a bit cleaner to me.

Let's also add some intermediate variables to main, just to clarify what happens:

main = do
    code &lt;- readFile "countdown.txt"
    let program = (generateProgram . map removeHash . stripLines . lines) code
    let result = (reverse . map chr . stack . until executionFinished executeProgram) program
    putStrLn result


While we're at adding variables, let's also look at names. The functions are generally named really well, that's a little less the case for their arguments. Especially for executeLine we can improve the names from a, b, and c. Let's instead use the terminology from the language itself:

executeLine program (differential, (Variable storage), adress)


Names can really help with understanding a program and choosing good names is really hard. On that note pc feels somewhat misleading. I think something like executedInstructions could be more helpful :)