runDFA :: DFA → String → Bool

runDFA dfa input = accept dfa $ transition (getInitialState dfa) $ input

f $ g $ x == (f . g) x이므로 함수의 합성 연산 (.)을 이용해 에타-소거하자.

runDFA dfa = (accept dfa) . (transition (getInitialState dfa))

어디서 봤다. 람다 셈법에서의 S combinator에 의하여 (.)가 들어올려져 있는 모습이다.

(r →)이 Monad인데 ap로서 S combinator을 가짐을 이용하면,

runDFA = liftM2 (.) accept (transition . getIntialState)

너무 아름답다 ㅠㅠ

근데 Pointfree.io에서 해보니까 똑같이 나온다.

어떻게 만들었지?