...与所有那些新的(如果我们计算IEnumerable不是那么新)与monad相关的东西?
interface IMonad<T>
{
SelectMany/Bind();
Return/Unit();
}
Run Code Online (Sandbox Code Playgroud)
这将允许编写以任何monadic类型操作的函数.或者它不是那么重要?
我的问题是关于sequence功能Prelude,其签名如下:
sequence :: Monad m => [m a] -> m [a]
Run Code Online (Sandbox Code Playgroud)
我理解这个函数是如何工作的List的Maybe秒.例如,将sequence上[Just 3, Just 9]给人Just [3, 9].
我注意到,应用sequence上List的Lists给出了笛卡尔乘积.有人可以帮我理解这是怎么回事?
在F#monad中,如果你说let!,编译器会将其转换为Bind你在monad构建器上定义的成员.
现在我看到有一个Query monads,如MSDN所示,你可以说:
query {
for student in db.Student do
select student
count
}
Run Code Online (Sandbox Code Playgroud)
和select和count,例如,将被翻译到QueryBuilder成员Linq.QueryBuilder.Select和Linq.QueryBuilder.Count.
我的问题是,关键字映射到成员是否已硬连接到F#编译器,还是可扩展?例如,我可以这样说:
FooMonadBuilder() {
bar
}
Run Code Online (Sandbox Code Playgroud)
并以某种方式告诉F#编译器bar映射到一个FooMonadBuilder.Bar()方法?
Haskell Data.Bifunctor基本上是:
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
Run Code Online (Sandbox Code Playgroud)
我也能找到一个Biapply.我的问题是,为什么不存在完整的双层次结构(层次结构?),如:
class Bifunctor f => Biapplicative f where
bipure :: a -> b -> f a b
biap :: f (a -> b) (c -> d) -> f a c -> f b d
class Biapplicative m => Bimonad m where
bibind :: m a b -> (a -> b -> m c d) …Run Code Online (Sandbox Code Playgroud) 可能重复:
什么是monad?
您如何用非编程术语描述monad?是否有一些概念/事物在编程之外(在所有编程之外,而不仅仅是FP),可以说是以一种重要的方式行事或像monad一样?
假设我有一个状态monad,例如:
data Registers = Reg {...}
data ST = ST {registers :: Registers,
memory :: Array Int Int}
newtype Op a = Op {runOp :: ST -> (ST, a)}
instance Monad Op where
return a = Op $ \st -> (st, a)
(>>=) stf f = Op $ \st -> let (st1, a1) = runOp stf st
(st2, a2) = runOp (f a1) st1
in (st2, a2)
Run Code Online (Sandbox Code Playgroud)
功能如
getState :: (ST -> a) -> Op a
getState g = Op …Run Code Online (Sandbox Code Playgroud) Hackage上有许多不同的monad变换器库.有些人似乎比其他人更受关注.仅举几例:mtl(由于某种原因取决于变压器的当前版本),变压器,monadLib,monads-tf,mtlx,contstuff.
应该首选哪一个?为什么?它们的独特之处是什么?性能怎么样?
在Haskell中,liftM2可以定义为:
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do
x1 <- m1
x2 <- m2
return $ f x1 x2
Run Code Online (Sandbox Code Playgroud)
我想把它翻译成Scala.我的第一次尝试如下:
def liftM2[T1, T2, R, M[_]](f: (T1, T2) => R)(ma: M[T1], mb: M[T2]) : M[R] = for {
a <- ma
b <- mb
} yield f(a, b)
Run Code Online (Sandbox Code Playgroud)
我认为这是最明显的可行方式:"flat flatMap不是类型参数M [T1]的成员".是的,我没有说明M[_]是某种单子.所以接下来我尝试的是定义一些结构类型,如:
type Monad[A] = {
def flatMap[B](f: (A) => …Run Code Online (Sandbox Code Playgroud) 我遇到了Haskell的问题.我的文本文件看起来像这样:
5.
7.
[(1,2,3),(4,5,6),(7,8,9),(10,11,12)].
Run Code Online (Sandbox Code Playgroud)
我不知道如何获得前两个数字(上面的2和7)和最后一行的列表.每行末尾有点.
我试图构建一个解析器,但是名为'readFile'的函数返回Monad,称为IO String.我不知道如何从这种类型的字符串中获取信息.
我更喜欢在一系列字符上工作.也许有一个函数可以从'IO String'转换为[Char]?