我创建了一个函数m,这样
m "abc" "def" == "bcd"
Run Code Online (Sandbox Code Playgroud)
我想创建另一个函数,用于在给定输入时m生成输出["bcd","efg","hia"]["abc","def","ghi"]
的定义m是
m :: [a] -> [a] -> [a]
m str1 str2 = (drop 1 str1) ++ (take 1 str2)
Run Code Online (Sandbox Code Playgroud)
您可以使用zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]此处将整个列表作为第一个参数和tail (cycle l)第二个参数(带有l列表):
combine :: [a] -> [a]
combine l = zipWith m l (tail (cycle l))Run Code Online (Sandbox Code Playgroud)
zipWith将同时枚举两个列表,并且每次调用m第一个和第二个列表的元素。例如:
Prelude> combine ["abc","def","ghi"]
["bcd","efg","hia"]
Run Code Online (Sandbox Code Playgroud)