【发布时间】:2016-06-08 11:41:47
【问题描述】:
本练习的目的是获取一个字符串列表并构造一个字符列表,换句话说,给定以下列表一个字符串
函数输入
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')]
现在是一元风格
这个问题在没有 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 列表并返回 pair 列表,它是 pair 的 context 所以它是绑定运算符的第一个参数 m a这应该与第二个函数zip'' 对齐。
因此函数zip'' 将采用每对/元组并应用其行为以返回 Char 的串联列表。
我错过了什么,代码有什么问题?
抱歉问题太长了
【问题讨论】:
-
很难确定您要达到的目标。您能否重新表述您的问题,以便清楚您要达到的目标?甚至可能只是一个带有相关期望输出的示例输入?
-
感谢您的关注,希望现在清楚
-
zip''接受(String, String)参数,但res1 :: [(String, String)]。您必须运行map zip'' res1才能获得您显示的res2。 -
zip',顺便说一下,可以更简洁地写成zip <*> tail。
标签: haskell functional-programming monads