如何通过与一个Haskell单子函数树的元素走路吗?

我定义较一树一新的数据类型。 我也实现了一个功能walk走在树中的所有元素,该函数的功能版本是正确的,但不是他的单子版本walkM

module Hdot where import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map data RDoll a = Null | RDoll a [RDoll a] deriving (Show) test :: RDoll Int test = RDoll 1 [RDoll 2 [Null], RDoll 3 [RDoll 4 [Null]]] walk :: (a -> b) -> RDoll a -> [b] walk f Null = [] walk f (RDoll x rds) = ((fx): (concatMap (\x -> walk fx) rds)) walkM :: (Monad m) => (a -> mb) -> RDoll a -> m [b] walkM f Null = return [] walkM f (RDoll rd rdss) = do x <- f rd xs <- concatMap (walkM f) rdss return (x:xs)

有一种类型的错误

Couldn't match type `b' with `[b]' ...

有人可以帮我!

感谢您的答复。

--------------解决方案-------------

通常情况下,你应该给予充分的错误消息,因为它有价值的背景:

A.hs:19:26:
Could not deduce (m ~ [])
from the context (Monad m)
bound by the type signature for
walkM :: Monad m => (a -> mb) -> RDoll a -> m [b]
at A.hs:(16,1)-(20,15)
`m' is a rigid type variable bound by
the type signature for
walkM :: Monad m => (a -> mb) -> RDoll a -> m [b]
at A.hs:16:1
Expected type: [b]
Actual type: mb
Expected type: a -> [b]
Actual type: a -> mb
In the first argument of `walkM', namely `f'
In the first argument of `concatMap', namely `(walkM f)'

因此,有值的列表之间的一些困惑[b]和行动mb

可疑代码为您的使用concatMap的运行walkM递归。 我想你的意思是使用concatMapM (如mapMconcat ):

walkM :: (Monad m) => (a -> mb) -> RDoll a -> m [b]
walkM f Null = return []
walkM f (RDoll rd rdss) = do
x <- f rd
xs <- mapM (walkM f) rdss
return (x:concat xs)


由于风格上的说明,我想尝试写的东西有点不同。 看看在基础库中的玫瑰树。 尤其是,不要定义walkwalkM ,定义函子,单子实例和重用现有的库函数。

分类:哈斯克尔 时间:2012-01-01 人气:0
本文关键词: 树,哈斯克尔,单子
分享到:

相关文章

  • 哈斯克尔 - 单子,其值限制在类型类 2012-08-30

    在Haskell中,有没有办法来限制一个单子M a ,这样a满足型类约束? 我翻译的概率模型例如,从F#哈斯克尔. 然而,在Haskell,我省略了support ,因为它会改变data Distribution a以data (Ord a) => Distribution a . 随着这一变化,我得到以下错误: ...probabilisticModeling.hs:42:13: Could not deduce (Ord a) from the context () arising from

  • 哈斯克尔单子用于模仿OO样式代码 2012-12-27

    在http://www.haskell.org/haskellwiki/State_Monad具体的例子是理解如何编写一个带单子真正的代码(也见计算器/ 9014218)非常有帮助. 但是我们大部分新生都来自一个面向对象的背景,所以映射一个面向对象的程序哈斯克尔将有助于演示如何编写一个等效Haskell代码. (是的,两种范式是完全不同的,这是不明智的直接转换的OO风格的代码哈斯克尔,但仅此一次作为一个教程.) 下面是一个面向对象的代码风格,它创建一个对象的两个实例,然后调用它可以改变它们各自的

  • 哈斯克尔单子形式 2013-10-11

    一个简单的问题:给出的定义,(从哈斯克尔SOE) do x - el; el\ ...; en => el »= \x - do e2\ ...; en 和: do let decllist; el\...; en => let decllist in do e2\ ...; en 看来,这两个构建体是相同的: do let x = e1 e2 和 do x <- e1 e2 这两个评估E1,将其绑定到E2,然后评估E2. 是? --------------解决方案-----------

  • 斯卡拉相当于哈斯克尔单子 2014-11-19

    我在Haskell中的一些经验,目前学习Scala. 我想知道是否有什么斯卡拉相当于单子? --------------解决方案------------- 你可能想看看scalaz; 它被强烈哈斯克尔的影响. 事实上,人们经常问的主要贡献者之一,为什么他们不只是用哈斯克尔,因为他们似乎很喜欢它这么多! Scalaz大量使用implicits,以装饰结构与他们的单子. 例如: val fibs = (0, 1).iterate[Stream]( i => i._2 -> (i._2 + i._1

  • 哈斯克尔单子MSUM在HappStack 2012-08-23

    从 http://happstack.com/docs/crashcourse/HappstackState.html 当我运行服务器,由偷看计数器增加 1,当我偷看 2,当我不偷看 有问题的相关代码: handlers :: ServerPart Response handlers = msum [ dir "peek" $ do c <- query PeekCounter ok $ toResponse $ "peeked at the count and saw

  • 当使用哈斯克尔单子 2013-03-26

    我采取在Haskell一个组合优化的算法: Given an initial candidate solution, repeat until stopping criteria are met: 1. Determine possible moves 2. Evaluate possible moves 3. Choose a move 4. Make move, record new candidate solution, update search state 我可以写步骤1-4的功能和它

  • 哈斯克尔单子功能 2015-01-25

    我经历一个Haskell教程和我给这一段代码做移动在国际象棋骑士: import Control.Monad type KnightPos = (Int,Int) moveKnight :: KnightPos -> [KnightPos] moveKnight (c,r) = do (c',r') <- [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1) ,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2) ] guard (c' `

  • 哈斯克尔单子:IO [双]到[IO双] 2014-02-11

    认为是应该打印出的随机数以下代码: import System.Random.Mersenne main = do g <- (newMTGen Nothing) xs <- (randoms g) :: IO [Double] mapM_ print xs 在运行时,我得到一个分段错误. 这并不令人意外,因为该函数"偶合"产生无限名单. 假设我想只打印出XS的前十个值. 我怎么能这样做呢? XS的类型为IO [双],我觉得我想类型的变量[IO双. 什么操作人员存在于两者之

  • 哈斯克尔可变图/树 2013-03-22

    我要寻找一个可变(平衡)树/地图/散在Haskell表或方式如何模拟它的功能中. 当我调用同一个函数多次也就是说,结构保存. 到目前为止,我已经尝试Data.HashTable(这是确定的,但有点慢),并试图Data.Array.Judy,但我无法使其与GHC 6.10.4工作. 是否还有其他选择吗? --------------解决方案------------- 如果你想可变的状态,你可以拥有它. 只要保持在传递更新的地图周围,或保持在一个状态单子(其结果是同样的事情). import qua

  • 在哈斯克尔哈希映射/台没有更多的状态单子的版本? 2014-08-20

    是一元接口凑套和地图在Haskell哪里去了? 我应该有什么样的表现模型考虑使用现代版本的时候? (Data.Map中,Data.HashMap,Data.HashSet). 他们没有出现在我的版本有任何IO代码(GHC 7.0.2) > :browse Data.HashSet type HashSet a = Set a newtype Set a = Data.HashSet.Set (Data.IntMap.IntMap (Data.HashSet.Some a)) (\\) :: Or

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.459 (s). 10 q(s)