Tag: 单子

将string转换为整数/浮点在Haskell?

data GroceryItem = CartItem ItemName Price Quantity | StockItem ItemName Price Quantity makeGroceryItem :: String -> Float -> Int -> GroceryItem makeGroceryItem name price quantity = CartItem name price quantity 我想在使用String或[String]时创build一个GroceryItem, createGroceryItem :: [String] -> GroceryItem createGroceryItem (a:b:c) = makeGroceryItem abc input的格式是[“Apple”,“15.00”,“5”],我使用haskell中的单词函数进行分解。 我得到这个错误,我认为是因为makeGroceryItem接受一个浮点数和一个整数。 但是,我如何分别做b和c Float和Int? *Type error in application *** Expression : makeGroceryItem a read […]

如何玩Haskell中的Control.Monad.Writer?

我是function编程的新手,最近在学习你一个Haskell的时候学习,但是当我阅读本章的时候 ,我被下面的程序困住了: import Control.Monad.Writer logNumber :: Int -> Writer [String] Int logNumber x = Writer (x, ["Got number: " ++ show x]) multWithLog :: Writer [String] Int multWithLog = do a <- logNumber 3 b <- logNumber 5 return (a*b) 我把这些行保存在一个.hs文件中,但没有把它导入到我的ghci中, more1.hs:4:15: Not in scope: data constructor `Writer' Perhaps you meant `WriterT' (imported from Control.Monad.Writer) […]

状态,ST,IORef和MVar之间的区别

我正在48小时内写作自己的计划 (我约85小时),我已经到了关于添加variables和作业的部分。 本章有一个很大的概念上的跳跃,我希望这个过程是分两步完成的,在这之间有一个很好的重构,而不是直接跳到最后的解决scheme。 无论如何… 我已经迷失了许多不同的课程,这些课程似乎有相同的目的: State , ST , IORef和MVar 。 正文中提到了前三个,而最后一个似乎是前三个StackOverflow问题的答案。 它们似乎都在连续调用之间进行状态。 这些都是什么,它们又有什么不同呢? 特别是这些句子没有意义: 相反,我们使用称为状态线程的function,让Haskell为我们pipe理聚合状态。 这让我们可以像处理任何其他编程语言一样使用函数来获取或设置variables。 和 IORef模块允许您使用IO monad内的有状态variables。 所有这些使得行type ENV = IORef [(String, IORef LispVal)]混淆 – 为什么第二个IORef ? 如果我写入type ENV = State [(String, LispVal)]会怎样呢?

为什么python dict.update()没有返回对象?

我正在尝试做: award_dict = { "url" : "http://facebook.com", "imageurl" : "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png", "count" : 1, } def award(name, count, points, desc_string, my_size, parent) : if my_size > count : a = { "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, } a.update(award_dict) return self.add_award(a, siteAlias, alias).award 但是如果在function上感觉真的很麻烦,而且我宁愿做: return self.add_award({ "name" : […]

为什么我们有map,fmap和liftM?

map :: (a -> b) -> [a] -> [b] fmap :: Functor f => (a -> b) -> fa -> fb liftM :: Monad m => (a -> b) -> ma -> mb 为什么我们有三个不同的function基本上是一样的?

避免嵌套try catch块的模式?

考虑一种情况,我有三种(或更多)的计算方法,每种方法都可能会失败并产生一个exception。 为了尝试每一个计算,直到find一个成功的,我一直在做以下工作: double val; try { val = calc1(); } catch (Calc1Exception e1) { try { val = calc2(); } catch (Calc2Exception e2) { try { val = calc3(); } catch (Calc3Exception e3) { throw new NoCalcsWorkedException(); } } } 有没有一种更好的方式来达到这个目的? 当然,我可以将每个计算包装在一个帮助器方法中,在失败时返回null,然后使用?? 运算符,但有没有办法更一般地这样做(即不必为每个我想使用的方法编写一个帮助器方法)? 我想写一个静态方法使用generics封装在try / catch中的任何给定的方法,并在失败时返回null,但我不知道如何去做这件事。 有任何想法吗?

Scalaz迭代:“提升”EnumeratorT与“IterateeT”匹配“更大”的monad

如果我有一个EnumeratorT和一个相应的IterateeT我可以一起运行它们: val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c")) val it: IterateeT[String, Task, Int] = IterateeT.length (it &= en).run : Task[Int] 如果枚举器monad比iteratee monad“大”,我可以用up或者更一般地说, Hoist来“提升”迭代器以匹配: val en: EnumeratorT[String, Task] = … val it: IterateeT[String, Id, Int] = … val liftedIt = IterateeT.IterateeTMonadTrans[String].hoist( implicitly[Task |>=| Id]).apply(it) (liftedIt &= en).run: Task[Int] 但是当iteratee monad比枚举器monad“更大”时,我该怎么做? val en: EnumeratorT[String, Id] = […]

非Functor / Functor / Applicative / Monad的好例子?

在向某人解释什么是Xtypes的时候,我很难find恰好是X的数据结构的好例子。 所以,我请求例子: 一个不是Functor的types构造函数。 一个types构造函数,它是一个Functor,但不适用。 一个types构造函数是一个应用程序,但不是一个Monad。 Monad的types构造函数。 我认为Monad在世界各地都有很多的例子,但是Monad的一个很好的例子是与之前的例子有一些联系,可以完成这个图画。 我寻找相似的例子,仅在属于特定types的重要方面有所不同。 如果有人能够在这个层次结构的某个地方偷偷摸摸地find一个箭头的例子(它在Applicative和Monad之间?),那也太棒了!

为什么我们需要monads?

在我看来,这个着名的问题是“什么是单子”? 特别是最被投票的人,试图解释什么是monad,却没有明确解释monad 为什么是必要的 。 他们可以解释为一个问题的解决scheme吗?

什么是索引monad?

什么是索引monad和这个monad的动机? 我已经读过,它有助于跟踪副作用。 但型号签名和文件不会导致我到任何地方。 什么样的方式可以帮助跟踪副作用(或其他有效的例子)?