【发布时间】:2022-01-03 02:59:03
【问题描述】:
我正在尝试编写一个函数join :: [[a]] -> [[a]],它将列表中列表的最后一个字符与列表中列表的第一个字符连接起来。
join ["m"] = ["m"]
join ["a","b","c"] = ["b","c","a"]
join ["goodday", "world", "i", "love", "haskell"] = ["ooddayw","orldi","l","oveh","askellg"]
join ["the", "catcher", "in", "the", "rye"] = ["hec","atcheri","nt","her","yet"]
我正在尝试编写一个仅使用 Haskell 中的基本函数(没有库函数)并且仅使用递归的代码。
但是,我似乎无法实现一段正常工作的代码。这是我到目前为止的代码:
join :: [[a]] -> [[a]]
join [[a]] = [[a]]
join (n:ns:nss) | null nss == False = ((i n ns) : k (ns:nss))
| otherwise = []
可以这样做吗?
【问题讨论】:
-
将问题分成更小的部分可能更容易。例如,从一个函数开始,该函数仅从每个子列表
[[a]] -> ([[a]], [a])中提取第一个元素。从那里您可以考虑旋转提取的列表,然后将元素重新连接到每个相应子列表的末尾。 -
我建议不要使用名称
join,因为这是 Prelude 中可用的重要功能的名称。 -
@RobinZigmond 要是真的在 Prelude 就好了
-
@amalloy - 哎呀,所以你是对的,它不是。我可以发誓它是:/