fact n = fact-tail n 1
    where fact-tail 1 acc = 1
        fact-tail n acc = fact-tail (n - 1) (acc * n)

みたいに素直に再帰で書き下せるところをいちいち末尾再帰に書き換えるように
なってしまいました。

こういうのってプログラム見にくいんじゃないかなぁと思いますが、
どうでしょうか?

好きにしろって言われるかもしれませんが