小编nor*_*ane的帖子

Haskell >> = operation:为什么返回另一个Monad需要函数参数?

考虑到表达式:

[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)

这样您就不必处理扁平化结果.

monads haskell functional-programming

10
推荐指数
1
解决办法
160
查看次数

如何重复haskell中的函数列表

我希望有一个循环通过某种模式的无限函数列表.例如:[(+), (-), (+), (-), ...]

如果我做的事情

fmap repeat [(+), (-)]
Run Code Online (Sandbox Code Playgroud)

然后我得到嵌套列表[[a -> a -> a]].在这样的模式之后获得单个无限函数列表的最佳方法是什么?

haskell functional-programming

5
推荐指数
1
解决办法
230
查看次数

您可以将记录语法与Haskell数据类型中的枚举混合使用吗?

我写了以下内容:

data Expression = Expression { lhs :: Int, rhs :: Expression } | Int
Run Code Online (Sandbox Code Playgroud)

问题是如果我尝试用一​​个int构造一个Expression我得到一个部分应用的函数.解决这个问题的最佳方法是什么?

haskell functional-programming

3
推荐指数
1
解决办法
187
查看次数

如何在Haskell中允许表达式阻塞

在下面的代码第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

2
推荐指数
1
解决办法
339
查看次数

Haskell Alternative 中“一些”和“许多”函数的定义是什么意思

我一直想用 Haskell 编写一个词法分析器,并偶然发现了这些函数。

如果定义的话,somemany应该是方程的最小解:

some v = (:) <$> v <*> many v

many v = some v <|> pure []

我知道(:)insome被提升并应用于 的值,v以便将其添加到 in 返回的列表中many v

但为什么 的定义以many开头some呢?为什么它会与 连在一起pure []

这两个函数有什么关系或区别?这些方程的最小解意味着some什么?递归如何停止?帮助!many

haskell functional-programming some-and-many

2
推荐指数
1
解决办法
419
查看次数