Haskell 函数查找两个列表元素之间的所有映射
Haskell function finding all maps between elements of two lists
我正在为给定两个列表(A 和 B)的 Haskell 函数编写代码而苦苦挣扎 returns 所有映射的列表 Fi: A --> B 其中单个映射表示为对列表。函数头将是:
findAllMappings :: [a] -> [b] -> [[(a, b)]]
例如,在 运行 之后的两个列表的函数如下:
findAllMappings [1, 2] ["A", "B"]
我希望输出如下:
[
[(1, "A"), (2, "A")],
[(1, "B"), (2, "B")],
[(1, "A"), (2, "B")],
[(1, "B"), (2, "A")],
]
由于这显然是家庭作业而且您没有尝试,所以我不会破坏整个解决方案,但这里有一些提示可以帮助您入门:
首先,创建一个类型为 a -> [b] -> [(a, b)]
的辅助函数。作为不破坏整个解决方案的一部分,我不会告诉你这应该做什么,但在它的类型和下面我如何使用它之间,你应该能够弄明白。
其次,有了这个助手,您就可以轻松地为已知的列表长度编写函数。这是长度 0-3:
findAllMappings [] bs = [[]]
findAllMappings [a0] bs = [[ab0] | ab0 <- helper a0 bs]
findAllMappings [a0, a1] bs = [[ab0, ab1] | ab0 <- helper a0 bs, ab1 <- helper a1 bs]
findAllMappings [a0, a1, a2] bs = [[ab0, ab1, ab2] | ab0 <- helper a0 bs, ab1 <- helper a1 bs, ab2 <- helper a2 bs]
但很明显,您不能只针对最终答案执行此操作,因为您需要处理任意长度的列表,而且您不能对每个长度都使用一个案例来执行此操作。所以研究一下这是干什么的,想办法用递归函数来做。
作为替代方法,想出一个这样的函数(提示:base
已经有了,所以你不需要写):
f 0 ["A", "B"] = [[]]
f 1 ["A", "B"] = [["A"], ["B"]]
f 2 ["A", "B"] = [["A", "A"], ["A", "B"], ["B", "A"], ["B", "B"]]
然后找到一种方法将传递给 findAllMappings
的第一个列表中的元素附加到它的适当结果(提示:base
也已经有这方面的功能)。
我正在为给定两个列表(A 和 B)的 Haskell 函数编写代码而苦苦挣扎 returns 所有映射的列表 Fi: A --> B 其中单个映射表示为对列表。函数头将是:
findAllMappings :: [a] -> [b] -> [[(a, b)]]
例如,在 运行 之后的两个列表的函数如下:
findAllMappings [1, 2] ["A", "B"]
我希望输出如下:
[
[(1, "A"), (2, "A")],
[(1, "B"), (2, "B")],
[(1, "A"), (2, "B")],
[(1, "B"), (2, "A")],
]
由于这显然是家庭作业而且您没有尝试,所以我不会破坏整个解决方案,但这里有一些提示可以帮助您入门:
首先,创建一个类型为 a -> [b] -> [(a, b)]
的辅助函数。作为不破坏整个解决方案的一部分,我不会告诉你这应该做什么,但在它的类型和下面我如何使用它之间,你应该能够弄明白。
其次,有了这个助手,您就可以轻松地为已知的列表长度编写函数。这是长度 0-3:
findAllMappings [] bs = [[]]
findAllMappings [a0] bs = [[ab0] | ab0 <- helper a0 bs]
findAllMappings [a0, a1] bs = [[ab0, ab1] | ab0 <- helper a0 bs, ab1 <- helper a1 bs]
findAllMappings [a0, a1, a2] bs = [[ab0, ab1, ab2] | ab0 <- helper a0 bs, ab1 <- helper a1 bs, ab2 <- helper a2 bs]
但很明显,您不能只针对最终答案执行此操作,因为您需要处理任意长度的列表,而且您不能对每个长度都使用一个案例来执行此操作。所以研究一下这是干什么的,想办法用递归函数来做。
作为替代方法,想出一个这样的函数(提示:base
已经有了,所以你不需要写):
f 0 ["A", "B"] = [[]]
f 1 ["A", "B"] = [["A"], ["B"]]
f 2 ["A", "B"] = [["A", "A"], ["A", "B"], ["B", "A"], ["B", "B"]]
然后找到一种方法将传递给 findAllMappings
的第一个列表中的元素附加到它的适当结果(提示:base
也已经有这方面的功能)。