将 Scheme 闭包定义函数翻译成 Haskell
Translate Scheme closure-defining function into Haskell
下面的程序,用Scheme写的,
(define (eat xs)
(lambda (x)
(if (eq? x 'vomit)
(reverse xs)
(eat (cons x xs)))))
可以通过以下方式调用:
> eat
#{procedure 9165 eat}
> (eat '())
#{procedure 9166 (unnamed in eat)}
> ((eat '()) 1)
#{procedure 9166 (unnamed in eat)}
> (((((eat '()) 1) 2) 3) 4)
#{procedure 9166 (unnamed in eat)}
> ((((((eat '()) 1) 2) 3) 4) 'vomit)
(1 2 3 4)
因为没有突变,例如。 set!
,并且使用递归传递状态我认为这在 Haskell:
中写起来很简单
eat xs x = if x == "vomit" then reverse xs else eat (x:xs)
-- Couldn't match expected type ‘[[Char]]’
-- with actual type ‘[Char] -> [[Char]]’
-- Probable cause: ‘eat’ is applied to too few arguments
-- In the expression: eat (x : xs)
-- In the expression:
-- if x == "vomit" then reverse xs else eat (x : xs)
我是不是遗漏了一些明显的东西,还是根本不可能?
因为你有一个递归类型,你需要显式声明它:
data T a = L [a] | F (a -> T a)
(+>) (F f) = f
unL (L x) = x
eat xs x = if x == "vomit" then L $ reverse xs else F $ eat (x:xs)
eaten = unL $ eat [] "x" +> "y" +> "z" +> "vomit"
> eaten
["x","y","z"]
正在定义
eaten1 = eat [] "x" +> "y"
eaten2 = eaten1 +> "z" +> "vomit"
也有效:
> unL $ eaten1 +> "vomit"
["x","y"]
> unL $ eaten2
["x","y","z"]
下面的程序,用Scheme写的,
(define (eat xs)
(lambda (x)
(if (eq? x 'vomit)
(reverse xs)
(eat (cons x xs)))))
可以通过以下方式调用:
> eat
#{procedure 9165 eat}
> (eat '())
#{procedure 9166 (unnamed in eat)}
> ((eat '()) 1)
#{procedure 9166 (unnamed in eat)}
> (((((eat '()) 1) 2) 3) 4)
#{procedure 9166 (unnamed in eat)}
> ((((((eat '()) 1) 2) 3) 4) 'vomit)
(1 2 3 4)
因为没有突变,例如。 set!
,并且使用递归传递状态我认为这在 Haskell:
eat xs x = if x == "vomit" then reverse xs else eat (x:xs)
-- Couldn't match expected type ‘[[Char]]’
-- with actual type ‘[Char] -> [[Char]]’
-- Probable cause: ‘eat’ is applied to too few arguments
-- In the expression: eat (x : xs)
-- In the expression:
-- if x == "vomit" then reverse xs else eat (x : xs)
我是不是遗漏了一些明显的东西,还是根本不可能?
因为你有一个递归类型,你需要显式声明它:
data T a = L [a] | F (a -> T a)
(+>) (F f) = f
unL (L x) = x
eat xs x = if x == "vomit" then L $ reverse xs else F $ eat (x:xs)
eaten = unL $ eat [] "x" +> "y" +> "z" +> "vomit"
> eaten
["x","y","z"]
正在定义
eaten1 = eat [] "x" +> "y"
eaten2 = eaten1 +> "z" +> "vomit"
也有效:
> unL $ eaten1 +> "vomit"
["x","y"]
> unL $ eaten2
["x","y","z"]