확실한. 람다 용어의 정의에 따라 직접 생성 할 수 있습니다.
Haskell에서는 먼저 데이터 유형을 정의합니다.
data LC a = Var a -- Constructor <type> <type> ...
| App (LC a) (LC a) --
| Lam a (LC a) -- ... alternatives ...
instance Show a => Show (LC a) -- `LC a` is in Show if `a` is in Show, and
where
show (Var i) = [c | c <- show i, c /= '\'']
show (App m n) = "(" ++ show m ++ " " ++ show n ++ ")"
show (Lam v b) = "(^" ++ show (Var v) ++ "." ++ show b ++ ")"
그리고 fair (er) join
를 사용하여
lambda :: [a] -> [LC a]
lambda vars = terms
where
terms = fjoin [ map Var vars ,
fjoin [ [App t s | t <- terms] | s <- terms ] ,
fjoin [ [Lam v s | v <- vars ] | s <- terms ] ]
fjoin :: [[a]] -> [a]
fjoin xs = go [] xs -- fairer join
where
go [] [] = []
go a b = reverse (concatMap (take 1) a) ++ go
(take 1 b ++ [t | (_:t) <- a]) (drop 1 b)
우리는 예를 들어 그것들을 열거합니다.
> take 20 $ lambda "xyz"
[x,y,(x x),z,(y x),(^x.x),(x y),(^y.x),((x x) x),(^x.y),(y y),(^z.x),(x (x x)),
(^y.y),(z x),(^x.(x x)),((x x) y),(^z.y),(y (x x)),(^y.(x x))]
> take 5 $ drop 960 $ lambda "xyz"
[(((x x) y) (z x)),(^y.(^x.((x x) (x x)))),((^x.(x x)) (^x.(x x))),(^x.((^z.x)
y)),((z x) ((x x) y))]
보세요, 유명한 용어는 위에서 아래로 멀지 않습니다!Ω=(λx.xx)(λx.xx)
fjoin
에 해당 모나드 오메가 의 diagonal
.