在Haskell Wikibook中,foldr实现如下:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f acc [] = acc
foldr f acc (x:xs) = f x (foldr f acc xs)
Run Code Online (Sandbox Code Playgroud)
声明累加器的初始值被设置为参数.但据我了解,acc是操作的标识值(例如0表示sum或1表示产品),其值在执行函数期间不会改变.那么为什么它在这里和其他文本中被称为累加器,暗示它一步一步地改变或积累一个值?
我可以看到累加器在左折叠中是相关的,例如foldl,但是wikibook解释是不正确的,并且仅用于对称,在这种情况下它是错误的?
是否有任何关于如何使用该DMap类型的例子?包文档是非常有用的,我知道它仅供参考,但它对于一个入门是非常无益的.谷歌没有透露任何我能看到的东西.
我无法理解monad中的递归.从haskell.org wiki这里有一个例子:
main = f 3
f 0 = return []
f n = do v <- getLine
vs <- f (n-1)
return $! v : vs
Run Code Online (Sandbox Code Playgroud)
该程序递归地从标准输入获得三行.我无法理解的是当你到达f 0时以及递归如何解开时会发生什么.如何构造do块的最终值?为什么在递归中重复调用最终返回行?我知道返回不是命令式语言中的函数返回,但我看不出这条线是如何重复的.
我知道这是一个原始的初学者问题,但我很难过.
为什么Control.Monad.Reader中有一个Reader monad和一个MonadReader monad?包文档讨论了Reader monad,然后直接启动MonadReader文档,没有任何解释.这些monad有什么区别?阅读这些参考页面让我感到困惑.有趣的是,Haskell wikibook的Reader monad页面尚未编写!
我看到Writer monad如何允许我们生成一个字符串列表以及一组计算,但这有什么用呢?看起来很粗糙.似乎很少有"真实世界"使用Writer的例子.除了教学目的之外,这个monad实际上有用的是什么?
缺乏示例似乎是学习Haskell的障碍之一.如果有一个全面的Haskell Cookbook可以提供帮助,那就太好了.(那么,有吗?)
对于( - >)我们有:
Prelude> :i (->)
data (->) t1 t2 -- Defined in ‘GHC.Prim’
Run Code Online (Sandbox Code Playgroud)
这个语法是什么意思?我认为数据声明关键字需要LHS上的类型构造函数和RHS上的一个或多个值构造函数?
通常如何( - >)说出或发音?
如果我们有玫瑰树定义如下:
data Rose a = a :> [Rose a]
Run Code Online (Sandbox Code Playgroud)
然后我知道:>是一个中缀构造函数.但是你如何使用这种树的元素呢?如何遍历它以访问节点或提取子树或元素?
如果我有以下内容,例如:
import Data.Time.Clock.POSIX
t = getPOSIXTIME
Run Code Online (Sandbox Code Playgroud)
然后是t :: IO POSIXTime.这意味着它在IO monad中,我理解这一点.有没有办法从monad中获取值以用于程序中的其他函数?我不想将值输出到终端.
我为这样一个新手问题道歉,但是我阅读的monad教程越多,我就越不了解它.这基本上是关于单子的问题,而不是具体的时间问题.
Haskell 程序员提到非确定性是什么意思?我读到列表 monad 可用于对非确定性建模,但肯定列表不是非确定性的?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。
我试图使用newtype重新定义monad列表实例以创建包装列表类型,以便允许完成此操作,因为似乎无法覆盖Prelude定义.
到目前为止,我有以下内容:
newtype MyList a = MyList { unMyList :: [a] }
deriving Show
myReturn :: a -> [a]
myReturn x = [x]
myBind :: [a] -> (a -> [b]) -> [b]
myBind m f = concat $ map f m
instance Monad MyList where
return x = MyList [x]
xs >>= f = undefined
Run Code Online (Sandbox Code Playgroud)
作为Haskell的初学者,我无法知道如何为实例定义>> =运算符,使用我的函数来定义bind.
myReturn和myBind函数是否应该使用MyList而不是普通类型变量?如何正确定义>> =所需的包装和拆包?
我陷入了映射f的函数参数,其中f :: a - > [b],但似乎我需要f :: a - > MyList b,但是map不会接受它作为参数.
为混乱道歉.所有帮助表示赞赏
[我知道这里有一个类似的问题:重新定义列表monad实例,但我担心我不能按照那里的答案.]
Prelude声明const是一元函数.类型签名是
const :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)
一元函数需要一个参数.然而const函数似乎采用两个参数并丢弃第二个参数,这将使它成为二元函数.这里发生了什么?我想你可以将类型括起来
a -> (b -> a)
Run Code Online (Sandbox Code Playgroud)
但我对const的实际用法非常不清楚.为什么const被明确描述为一元?