考虑到表达式:
[0,1..] >>= \i -> [i * 2]
Run Code Online (Sandbox Code Playgroud)
在>>=for List 的定义中,lambda函数\i -> [i * 2]通过fmap映射到list参数,从而生成列表列表[[0], [2]..].因此>>=需要使用join函数展平结果以返回列表:[0, 2..]
根据这个来源:"...根据fmap和join的定义,适用于每个monad m:ma >>= k = join $ fmap k ma"
那么为什么有必要将提供monad的负担放在提供给>> =的函数上?为什么不简单地定义bind呢?
ma >>= k = fmap k ma
Run Code Online (Sandbox Code Playgroud)
这样您就不必处理扁平化结果.
我希望有一个循环通过某种模式的无限函数列表.例如:[(+), (-), (+), (-), ...]
如果我做的事情
fmap repeat [(+), (-)]
Run Code Online (Sandbox Code Playgroud)
然后我得到嵌套列表[[a -> a -> a]].在这样的模式之后获得单个无限函数列表的最佳方法是什么?
我写了以下内容:
data Expression = Expression { lhs :: Int, rhs :: Expression } | Int
Run Code Online (Sandbox Code Playgroud)
问题是如果我尝试用一个int构造一个Expression我得到一个部分应用的函数.解决这个问题的最佳方法是什么?
在下面的代码第4行中,我的表达式夹在do块中的两个IO操作之间:
1 doubleX :: (Show x, Num x) => x -> IO ()
2 doubleX x = do
3 putStrLn ("I will now double " ++ (show x))
4 let double = x * 2
5 putStrLn ("The result is " ++ (show double))
Run Code Online (Sandbox Code Playgroud)
我理解将符号表示为使用>> =或>>将monadic操作链接在一起.但是当你在两者之间有表达式时,它是如何工作的?你不能只使用>>将3-5号线粘在一起.
我一直想用 Haskell 编写一个词法分析器,并偶然发现了这些函数。
如果定义的话,
some和many应该是方程的最小解:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
我知道(:)insome被提升并应用于 的值,v以便将其添加到 in 返回的列表中many v。
但为什么 的定义以many开头some呢?为什么它会与 连在一起pure []?
这两个函数有什么关系或区别?这些方程的最小解意味着some什么?递归如何停止?帮助!many