타입 Set :: * → *도 이론상 모나드이니까,
이것도 이론상 모나드 아닌가요?
class Logical a where some :: (a -> Bool) -> Bool newtype Pred a = Pred { runPred :: a -> Bool } deriving () instance Monad Pred where return a = Pred go where go a' = a == a' x >>= f = Pred go where go b = let condition a = runPred x a && runPred (f a) b in some condition fail _ = Pred go where go _ = False data Nat = Zero | Succ Nat deriving (Eq, Logical) plus :: Nat -> Nat -> Pred Nat plus x Zero = do return x plus x (Succ pr) = do y <- plus x pr return (Succ y)
모나드로 간주하는 것은 하스켈식 문제해결법이니까요
잘 모르겠지만 predicate monad치면 뭔가 있긴 하니 모나드 규칙만 지킨다면 문제없지 않을지. 하스켈도 가급적 모나드같은 것보단 조립하기 쉬운 순수 함수를 선호함.. 모나드가 2개만 겹쳐도 조금 막막해짐.
그러니까 하스켈의 문법을 가지는 논리형 언어를 구상하다가 나온 생각이에요 - dc App
IO처럼 술어가 모나드라면 어떨까 생각해봤는데 맞아떨어지는 것 같아서요 - dc App