1

嘿,我正在为周五即将到来的函数式编程考试进行复习,我正在完成我们讲师提供的练习。我遇到了一个需要帮助的问题:

6. a) 编写一个函数,将给定的列表 xs 与列表 yss 中的每个列表一起压缩。在定义函数时尽可能使用部分应用程序和 lambda 表达式。b) 编写一个函数,用给定的列表 xs 压缩列表 yss 中的每个列表。在定义函数时尽可能使用部分应用程序和 lambda 表达式。你对这个问题的 a) 部分和 b) 部分的解决方案之间的区别说明了部分应用的函数必须以正确的顺序接受它们的参数。

我目前对(a)的看法是:

zipAll = (\xs (ys:yss) -> [(zip xs ys)] ++ zipAll xs yss)

我知道这不是详尽的,但有人可以给我一些指示吗?

4

2 回答 2

1

似乎您只是缺少基本案例来使该功能正常工作。基本情况是

(\xs [ys] -> [(zip xs ys)])

我可能会将参数移到等式的右侧:

zipAll xs (ys:yss) = ...

但这只是风格问题。

(b) 部分的解决方案是相同的,只是参数的顺序颠倒了,如

zipAll (ys:yss) xs = ...
于 2010-01-12T15:47:01.460 回答
1

很好,我解决了:

zipList :: [a] -> [[b]] -> [[(a,b)]]
zipList = \xs yss -> c xs yss
                        where
                                c xs [] = []
                                c xs (ys:yss) = zip xs ys :zipList xs yss

只是希望我现在没有发布这个:P

于 2010-01-12T15:47:26.987 回答