在一行Haskell中的Thue-Morse序列

时间:2016-02-06 23:09:55

标签: haskell lambda lambda-calculus

我在{Haskell的一行中写了一个Thue-Morse squence的定义作为无限的整数列表:

thueMorse = 0:1:f (tail thueMorse) where f = (\(x:xs) -> x:(1 - x):f xs)

这是尝试在一行中定义序列失败的结果,只是在lambda表达式和本身方面,没有let或where表达式(实际上应该在两行上呈现,使上面的解决方案成为两个精神内衬)。我一直在读一些关于lambda演算的内容,所以我想我会把它作为一个练习。我想知道在Haskell中是否可以这样做,以及如果可能的话如何做。

thueMorse = 0:1:(\f xs -> f f xs) (\f (x:xs) -> x:(1 - x):f f xs) ((\(_:xs) -> xs) thueMorse)

上面的表达有点难以阅读,所以我将其分解:

(\f xs -> f f xs)

接受一个函数和一个参数,并将该函数应用于自身和参数。 Haskell不会评估这个表达式,因为f的类型为t = t -> a -> a,这是我问题的症结所在。

(\f (x:xs) -> x:(1 - x):f f xs)

是否将函数传递给前一个表达式,该表达式将自身和列表作为参数。这是递归计算Thue-Morse序列的部分。这也有一个无限类型t = t -> [a] -> [a]

((\(_:xs) -> xs) thueMorse)

这只相当于(tail thueMorse),但是用lambda表达式来表示,以满足练习的条件。

Haskell抱怨这些表达式具有无限类型并且拒绝评估它们,我认为如果它们被评估,它们将正确地生成Thue-Morse序列。有没有办法扭曲解释器或编译器的手臂来评估这些表达式?有没有办法调整语句,以便可以评估它,但仍然只使用lambda演算中的运算符,并在一行?

1 个答案:

答案 0 :(得分:3)

这是相同的算法,但没有明确的fix

thueMorse = 0 : 1 : (tail thueMorse >>= \x -> [x, 1 - x])