将Scheme闭包定义函数转换为Haskell

将Scheme闭包定义函数转换为Haskell,haskell,recursion,types,scheme,closures,Haskell,Recursion,Types,Scheme,Closures,以下程序用Scheme编写 (定义(eat xs) (λ(x) (如果(等式x'呕吐物) (反向xs) (eat(cons x xs(()))) 可以通过以下方式调用: 吃东西 #{程序9165 eat} >(吃’()) #{程序9166(eat中未命名)} >((吃’())1) #{程序9166(eat中未命名)} >()(("吃")1)2)3)4) #{程序9166(eat中未命名)} >()((("吃")1)2)3)4"呕吐) (1 2 3 4) 因为没有突变,例如set,并且状态是

以下程序用Scheme编写

(定义(eat xs)
(λ(x)
(如果(等式x'呕吐物)
(反向xs)
(eat(cons x xs(())))
可以通过以下方式调用:

吃东西 #{程序9165 eat} >(吃’()) #{程序9166(eat中未命名)} >((吃’())1) #{程序9166(eat中未命名)} >()(("吃")1)2)3)4) #{程序9166(eat中未命名)} >()((("吃")1)2)3)4"呕吐) (1 2 3 4) 因为没有突变,例如
set,并且状态是使用递归传递的。我认为用Haskell编写此代码很简单:

eat xs x=如果x==“呕吐”,则反转xs-else eat(x:xs)
--无法匹配预期的类型“[[Char]]”
--实际类型为“[Char]->[[Char]]”
--可能原因:“eat”用于的参数太少
--在表达式中:eat(x:xs)
--在表达式中:
--如果x==“呕吐”,则反转xs,否则吃(x:xs)

我是否遗漏了一些显而易见的东西,或者说这是不可能的?

因为这里有一个递归类型,所以需要显式声明它:

data ta=L[a]| F(a->ta)
(++>)(F)=F
unL(lx)=x
eat xs x=如果x==“vomit”,则L$reverse xs else F$eat(x:xs)
已吃=unL$eat[]“x”+>“y”+>“z”+>“呕吐”
>吃的
[“x”、“y”、“z”]

定义

eaten1=eat[]“x”+>“y”
eaten2=eaten1+>“z”+>“呕吐”
也适用于:

>unL$eaten1+>“呕吐”
[“x”,“y”]
>unL$eaten2
[“x”、“y”、“z”]


由于其中包含递归类型,因此需要显式声明它:

data ta=L[a]| F(a->ta)
(++>)(F)=F
unL(lx)=x
eat xs x=如果x==“vomit”,则L$reverse xs else F$eat(x:xs)
已吃=unL$eat[]“x”+>“y”+>“z”+>“呕吐”
>吃的
[“x”、“y”、“z”]

定义

eaten1=eat[]“x”+>“y”
eaten2=eaten1+>“z”+>“呕吐”
也适用于:

>unL$eaten1+>“呕吐”
[“x”,“y”]
>unL$eaten2
[“x”、“y”、“z”]


eat
函数的类型是什么?可能类似于
eat:[a]->a->eat a
eat:[a]->a->other[a](a->other[a](a->other…
这是“不可能的”因为你对这个函数中的类型玩得太快太松散了。传递结果
'vomit
会产生一个列表,但传递其他任何东西都会产生一个过程。Haskell是静态类型的,所以你不能逃避同样的事情。你可以让它返回
或者
类型,但这是最好的结果。@chi this不是Scheme中的varargs函数。它所做的是构建一个新的闭包(一个函数)并在给定一个非“呕吐”参数时返回它。eat
函数的类型是什么?可能类似于
eat:[a]->a->eat a
eat:[a]->a->other[a](a->other[a](a->other…
它是“不可能"因为你对这个函数中的类型玩得太快太松散了。传递结果
'vomit
会产生一个列表,但传递其他任何东西都会产生一个过程。Haskell是静态类型的,所以你不能逃避同样的事情。你可以让它返回
或者
类型,但这是最好的结果。@chi this在Scheme中不是varargs函数。它所做的是构建一个新的闭包(函数),并在给定非“呕吐”时返回它argument.完全忘记了定义递归类型的需要Haskell为我们处理递归类型,而我们不必知道它是如何实现的。但我们需要为此声明特定类型,因为对于常规类型变量,它是被禁止的:
[a]~a->[a]
是无效的,因为
a
代表任何类型;但是当我们声明
T
时,它可以是递归的。完全忘记了定义递归类型的需要Haskell为我们处理递归类型,而我们不必知道它是如何实现的。但是我们需要为此声明一个特定类型,例如使用gen所有类型变量都是禁止的:
[a]~a->[a]
无效,因为
a
代表任何类型;但是当我们声明
T
时,它可以是递归的。