我开始了我的大哈斯克尔十字军(GHC :),我对单子和IOfunction有些困惑。 任何人都可以解释这两个函数有什么区别吗? f1 = do x <- [1,2] [x, x+1] — this is monad, right? f2 = do x <- [1,2] return [x, x+1] 结果是: *Main> f1 [1,2,2,3] *Main> f2 [[1,2],[2,3]]
我希望能够使用O(1)摊销寻址与vectortypes,根据所需的指数懒惰地增长。 这可以通过使用标准加倍algorithm来实现对O(1)访问进行配对,使用MVector (PrimState m) a :和PrimRef m [a]来保持余数。 {-# LANGUAGE ExistentialQuantification #-} module LazyVec where import Control.Monad.Primitive import Data.PrimRef import Data.Vector.Mutable (MVector) import qualified Data.Vector.Mutable as M import Data.Vector (fromList, thaw) import Control.Monad (forM_) data LazyVec ma = PrimMonad m => LazyVec (MVector (PrimState m) a) (PrimRef m [a]) — prime the LazyVec with the […]
鉴于: Applicative m, Monad m => mf :: m (a -> b), ma :: ma 这似乎被认为是一个法律: mf <*> ma === do { f <- mf; a <- ma; return (fa) } 或者更简洁: (<*>) === ap Control.Applicative的文档说<*>是“顺序应用程序”,这表明(<*>) = ap 。 这意味着, <*>必须按顺序从左到右评估效果,与>>= …保持一致。但这种感觉是错误的。 McBride和Paterson的原始文件似乎意味着从左到右的sorting是任意的: IO monad,实际上任何Monad都可以通过使用pure = return和<*> = ap 。 我们也可以用相反顺序执行计算的ap的变体 ,但是在本文中我们应该保持从左到右的顺序。 所以有两个合法的,不重要的派生出现在<*> >>=和return ,具有不同的行为。 […]
我在GHC6中使用了Haskell 2010.1.0.0.1。在GHCi提示符下键入:t后跟一个函数的名字,显示了函数的types。 有没有办法查看函数定义?
所以Haskell有一个叫做spoon的库,可以让我这样做 safeHead :: [a] -> Maybe a safeHead = spoon . head 但它也让我这样做 >>> spoon True :: Maybe Bool Just True >>> spoon (error "fork") :: Maybe Bool Nothing >>> spoon undefined :: Maybe Bool Nothing >>> spoon (let x = x in x) :: Maybe Bool <… let's just keep waiting…> 这在某些情况下似乎是非常有用的,但是它也违反了指称语义(就我的理解),因为它让我在⊥的语义前像中区分不同的事物。 这比throw / […]
我正在尝试定义一个新的monad,并且出现一个奇怪的错误 newmonad.hs 新types包装a =包装{unwrap :: a} 实例Monad包裹在哪里 (>> =)(Wrap x)f = fx 返回x =包装x main = do putStrLn“耶” $ ghc –version Glorious Glasgow Haskell编译系统,版本7.10.1 $ ghc newmonad.hs [1的1]编译主(newmonad.hs,newmonad.o) newmonad.hs:2:10: 没有适用于(应用包装)的实例 来自实例声明的超类 在“Monon Wrapped”的实例声明中 为什么我需要定义一个Applicative实例?
当我使用GHCi时,我几乎总是最终导入Control.Applicative , Data.List等。 有没有办法configurationGHCi自动导入这些模块。 而且,在导入之后,如何保持提示非常长? Prelude Control.Applicative Data.List Database.HDBC Database.HDBC.Sqlite3 System.Directory>
当我尝试定义新types时,出现ghci错误: 前奏>数据点= Pt Int Int <interactive>:1:0:input'data'时parsing错误 Prelude> let data Point = Pt Int Int <interactive>:1:4:在input'data'时parsing错误 我究竟做错了什么?
我们从类别理论中知道,并非Set中的所有pipe理者都承认自由单子。 规范的反例是powerset函子。 但是Haskell可以把任何函子变成一个免费的monad。 data Free fa = Pure a | Free (f (Free fa)) instance Functor f => Monad (Free f) where return = Pure Pure a >>= f = fa Free m >>= f = Free ((>>= f) <$> m) 是什么让这个构造对于任何Haskell函数起作用,但在Set中出现问题 ?
所以从乍一看,我可以看到5个漂亮的打印库: 好老HughesPJ在漂亮 WL-pprint,演员 WL-pprint-的terminfo WL-pprint ANSI-WL-pprint WL-pprint文本 哦,等等,是6? 6个漂亮的打印库…不用等,我们再来。 无论如何,除了HughesPJ,他们都是Wadler-Leijen。 我的理解是,WL更简单更快,所以可能是新代码的首选。 wl-pprint和wl-pprint-extras似乎是一样的…我不能说什么是关于后者的“额外”,或者“Free”在这里意味着什么(模块是Text.PrettyPrint.Free)。 wl-pprint-terminfo和ansi-wl-pprint都似乎是ANSIterminal颜色的变体,而且似乎是相同的,除了wl-pprint-terminfo没有任何文档。 wl-pprint-text当然使用文本。 我不知道有多less差距,实际上使速度。 让我担心的是,他们中的很多人都有很多发行版。 这意味着他们已经添加了function,修正了错误等。但是他们是否都有相同的错误修复? 我倾向于喜欢ansi-wl-pprint,因为它有文档,最后上传的时间是2012年,并且有一些版本暗示着作者仍然在上面。 但是我不确定。 任何人有任何build议? 而且我相信其他人也同意5个几乎不太完美的复制粘贴模块可以做一些整合。