Haskell:使用monad链接函数时出错

Haskell:使用monad链接函数时出错,haskell,functional-programming,monads,Haskell,Functional Programming,Monads,本练习的目的是获取一个字符串列表并构造一个字符列表,换句话说,给定下面的字符串列表 功能输入 print finalRes finalRes= [('c','c'),('c','c'),('a','b'),('c','b'),('b','c'),('b','b'),('c','a')] let input=[“c”、“cac”、“cb”、“bcc”、“ba”] 应用一些行为 将(输入)列表中的每个元素与列表的其余部分压缩后,我将得到一个元组列表,如下所示 print res1 res1 =

本练习的目的是获取一个字符串列表并构造一个字符列表,换句话说,给定下面的字符串列表

功能输入

print finalRes
finalRes= [('c','c'),('c','c'),('a','b'),('c','b'),('b','c'),('b','b'),('c','a')]
let input=[“c”、“cac”、“cb”、“bcc”、“ba”]

应用一些行为

将(输入)列表中的每个元素与列表的其余部分压缩后,我将得到一个元组列表,如下所示

print res1
res1 =  [("c","cac"),("cac","cb"),("cb","bcc"),("bcc","ba")]
在res1上应用一些其他行为

压缩列表中每对的第一项和第二项将得到下面的列表

 print res2
    res2 = [[('c','c')],[('c','c'),('a','b')],[('c','b'),('b','c')],[('b','b'),('c','a')]]
在res2上应用一些其他行为

输出

print finalRes
finalRes= [('c','c'),('c','c'),('a','b'),('c','b'),('b','c'),('b','b'),('c','a')]
现在是一元风格

这个问题在没有monad的情况下解决是显而易见的,虽然我对monad还不熟悉,并试图理解它,但我尝试使用绑定函数
>=
,我编写了2个函数并将其绑定在一起,以便从**输入**到输出

zip':: [String] -> [(String,String)]
zip' xs = zip xs (tail xs)

然后

ff=zip'>>=zip'

在编译代码时,我在函数ff中得到一个错误,该类型不对齐

让我把签名重新写一遍

Monad m => m a -> (a -> m b) -> m b
应用
ff[“c”、“cac”、“cb”、“bcc”、“ba”]

据我所知,
zip'
获取一个字符串列表并返回一个pair列表,该列表是pair的上下文,因此它是bind操作符的第一个参数
ma
,应该与第二个函数
zip'
对齐。 因此,函数
zip'
将获取每个对/元组并应用其行为,以返回连接的字符列表

我遗漏了什么,代码中有什么错误


很抱歉,您的
ff
功能已向后运行。您应该从
zip'
开始,然后像这样绑定到
zip'

ff list=zip'list>>=zip'
通过REPL运行它可以为您提供:

>让zip'xs=zip-xs(尾部xs)
>让压缩“=\(a,b)->压缩a和b
>让ff list=zip'列表>>=zip''
>ff[“c”、“cac”、“cb”、“bcc”、“ba”]
[('c','c'),('c','c'),('a','b'),('c','b'),('b','c'),('b','b'),('c','a')]

很难确定您想要实现的目标。你能重新表述一下你的问题吗?这样你就可以清楚地知道你想达到什么目的了?甚至可能只是一个示例输入和相关的所需输出?感谢您的关注,希望现在清楚
zip'
使用
(字符串,字符串)
参数,但是
res1:[(字符串,字符串)]
。您必须运行
map-zip'-res1
才能获得显示的
res2
zip'
,顺便说一下,可以更简洁地写成
zip-tail
zip':: [String] -> [(String,String)]
zip' xs = zip xs (tail xs)
zip'' :: ([a], [b]) -> [(a, b)]
zip''  = \(a,b)->zip a b
Monad m => m a -> (a -> m b) -> m b