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

时间:2016-06-08 11:41:47

标签: haskell functional-programming monads

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

功能输入

let input = ["c", "cac", "cb", "bcc", "ba"]

应用某些行为

zip' xs = zip xs (tail xs)
let res1 =zip' input

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

print res1
res1 =  [("c","cac"),("cac","cb"),("cb","bcc"),("bcc","ba")]

在res1上应用其他一些行为

zip''  = \(a,b)->zip a b
let res2 = zip'' res1

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

 print res2
    res2 = [[('c','c')],[('c','c'),('a','b')],[('c','b'),('b','c')],[('b','b'),('c','a')]]

在res2上应用其他一些行为

let finalRes = concat res2

输出

print finalRes
finalRes= [('c','c'),('c','c'),('a','b'),('c','b'),('b','c'),('b','b'),('c','a')]

NOW THE MONADIC STYLE

这个问题很明显,没有monad就可以解决它,虽然我是monad的新手,并试图理解它,我尝试使用绑定函数>>=来解决它,我写了2个函数并绑定它一起为了从**输入**到输出

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

zip'' :: ([a], [b]) -> [(a, b)]
zip''  = \(a,b)->zip a b

然后

ff =zip'' >>= zip'

在编译代码时,我在函数ff中遇到错误,该类型没有对齐。

让我重新编写绑定签名

Monad m => m a -> (a -> m b) -> m b

申请ff ["c", "cac", "cb", "bcc", "ba"]

正如我所理解的那样,zip'获取一个String列表并返回一对对象列表,这对是 context 对,因此它是第一个参数m a对于与第二个函数zip''对齐的绑定运算符。 所以函数zip''将获取每对/元组并应用其行为以返回连接的Char列表。

我错过了什么,以及代码中出了什么问题?

抱歉这个长问题

1 个答案:

答案 0 :(得分:3)

您的ff功能已退回。您应该从zip'开始并绑定到zip'',如下所示:

ff list = zip' list >>= zip''

通过REPL运行它会给你:

> let zip' xs = zip xs (tail xs)
> let zip'' = \(a,b)->zip a b
> let ff list = zip' list >>= zip''
> ff ["c", "cac", "cb", "bcc", "ba"]
[('c','c'),('c','c'),('a','b'),('c','b'),('b','c'),('b','b'),('c','a')]