我正在OCaml中创建monads,并且需要编写它们,所以我创建了变压器。我使用Identity monad实现了常规的monad(转换器):
module type MONAD = sig
type 'a m
val (>>=) : 'a m -> ('a -> 'b m) -> 'b m
val return : 'a -> 'a m
end
module Identity : MONAD = struct
type 'a m = 'a
let (>>
我已经看到在Scala中有不同的使用方式,从类似选项的包装器中提取一些值,或者在列表或其他集合上。如果我必须从Option中取出一个块,然后对其进行迭代,这可以在一个for块中完成吗?
例如:
val l: Option[List[Int]] = Some(List(1,2,3,4))
l: Option[List[Int]] = Some(List(1, 2, 3, 4))
for{
li <- l // li taken out from Option wrapper
number <- li // numbers pulled from li
} y
简而言之,我想声明一个这样的特点:
trait Test {
def test(amount: Int): A[Int] // where A must be a Monad
}
这样我就可以在不知道A是什么的情况下使用它了,比如:
class Usecase {
def someFun(t: Test) = for { i <- t.test(3) } yield i+1
}
更多细节..。
本质上,我想做这样的事情:
class MonadResultA extends SomeUnknownType {
// the base function
d
我有一组返回不同类型的方法:
Either[ErrorResponse, X]
Future[Either[ErrorResponse, X]]
Option[ErrorResponse]
这些方法需要前一个方法的结果来执行它们的计算。方法:
type Parameters = Map[String, String]
// allows me to flatmap on an either
implicit def toRightProjection[Failure, Success](e: Either[Failure, Success]) =
e.right
// converts
我正在尝试理解什么是monad(不仅在scala中,而且通过使用scala的例子)。让我们考虑(在我看来)最简单的monad示例:
scala.Some
正如一些文章所述,中的每个monad都应该为flatMap和unit函数保留一些规则。
以下是scala.Some的定义
@inline final def flatMap[B](f: A => Option[B]): Option[B]
所以,更好地理解它,我想要理解它,。所以,我们考虑的是一个单子,它应该是一个函子(,但介于什么?之间)。
在这里,我们必须分类Option[A]和Option[B],而flatMap以及传入的f: A
在试图将Monad理解为“表示定义为步骤序列的计算的结构”时:
这个例子:
def optionAdd(x:Option[Int], y:Option[Int]):Option[Int] =
for(xx <- x; yy <- y) yield xx+yy
取自。这个单模以预定义的顺序连接两个字符串。
我试图将这些步骤封装在一个单子中:
1. Get String to be converted to html
2. Perform series of replace statements on the String to create html compliant
是编写以下代码的最简单方法,而无需使用toStream()
import io.vavr.collection.List;
import io.vavr.control.Option;
import lombok.Value;
public class VavrDemo {
public static void main(String[] args) {
Foo bar = new Foo(List.of(new Bar(1), new Bar(2)));
Number value = Option.some(bar)
假设我正在创建一个简单的解释器,它可以抛出错误。
type Error = String
data Term = Con Int | Div Term Term
eval :: (MonadError Error m) => Term -> m Int
eval (Con a) = return a
eval (Div u v) = do
a <- eval u
b <- eval v
if b == 0 then
throwError "Division by zero"
else
return $ a `div`
在Scala中,我有一个Array[Option[(String,String,Try[String])]],我想找出所有失败的错误代码。
如果内部monad是一个Option[String],我可以用一个干净的小代码访问Some(x)内容以便于理解,如下所示:
for {
Some(row) <- row
(a,b,c) = row
x <- c
} yield x
但是如果内部monad是一个失败的,那么我正在努力寻找如何匹配它的模式,因为我不能将Failure(x) <- c放在for语句中。这感觉像是我遗漏了一件非常简单的事情,但任何指导都是非常有价值
我在一个宠物Scala项目中遇到了一个我真的不知道如何克服的情况。
下面的示例显示了我的问题。
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
case class MyBoard(id: Option[Int], name: String)
case class MyList(id: Option[Int], name: String, boardId: Option[Int] = None)
case class ErrorCreatingList(error
假设我有
type VS[A] = Validation[String, A]
val v: VS[Option[A]]
val f: A => VS[B]
我想得到一个VS[Option[B]]类型的结果,但是如果v是一个Success(None),那么结果也应该是一个Success(None)。下面是一个例子:
scala> val v: VS[Option[String]] = some("4.5").success
v: VS[Option[String]] = Success(Some(4.5))
scala> val f = (s : Stri
所以,我已经对f#的计算表达式和自定义构建器上瘾了。我不得不在日常工作中使用c#,但我仍然想在我自己的monads/monads中使用LINQ表达式。有人知道f#的Zero方法有没有类似于LINQ的方法?
下面是我在f#中做的事情:
type OptionBuilder() =
member x.Bind(v,f) = Option.bind f v
member x.Return v = Some v
member x.ReturnFrom o = o
member x.Zero() = Option.None
let option = OptionBui