haskell : error while chaining function using monad

标签 haskell functional-programming monads

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

函数输入

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

应用一些行为

zip' xs = zip xs (tail xs)
let res1 =zip' 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 的情况下解决它,虽然我是 monad 的新手并试图理解它,但我尝试使用绑定(bind)函数 >>= 来解决它,我写道2 函数并将其绑定(bind)在一起,以便从**输入**到输出:

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 中遇到错误,该类型未对齐。

让我重写绑定(bind)签名

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

应用ff ["c", "cac", "cb", "bcc", "ba"]

据我了解,zip'采用一个字符串列表并返回一个对列表,该列表是对的上下文,因此它是第一个参数m a 用于绑定(bind)运算符,它应与第二个函数 zip'' 对齐。 因此函数 zip'' 将获取每个对/元组并应用其行为以返回 Char 的串联列表。

我错过了什么,代码中有什么问题?

抱歉问了这么长的问题

最佳答案

你的ff函数是向后的。您应该从 zip' 开始并绑定(bind)到 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')]

关于 haskell : error while chaining function using monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37701551/

相关文章:

haskell - 如何从 xmonad 默认配置中删除 "Full"布局中的边框?

multithreading - 即使没有 `hFlush stdout`,循环线程也会挂起而没有 `print`

Haskell 左箭头运算符替代

haskell - 可能不可能的 mfix 是非平凡的总数吗?

haskell - 什么是单态性限制?

haskell - 为什么当数字常数超出范围时 GHC 不提示

haskell - `squares xs = [x*x|x<-xs]` 在 Haskell 中意味着什么?

javascript - Ramda 两者都否定

functional-programming - 如何在闭包中获取多个参数并打印它们?

haskell - 在 haskell 中创建 monad