Scala:操作のリストを無料のモナドに構成するにはどうすればよいですか?

すべてのプリズム

私は私が望むことをする無料のモナドを持っています:

type FreeOperation[F] = Free[Operation, F]

sealed trait Operation[O]
case object IdentityOperation extends Operation[GraphTraversal[_, _]]
case class LabelOperation(label: String) extends Operation[GraphTraversal[_, Vertex]]
case class HasOperation(has: String, within: List[_]) extends Operation[GraphTraversal[_, Vertex]]
case class InOperation(in: String) extends Operation[GraphTraversal[_, Vertex]]
case class OutOperation(out: String) extends Operation[GraphTraversal[_, Vertex]]
case class InEdgeOperation(inEdge: String) extends Operation[GraphTraversal[_, Edge]]
case class OutEdgeOperation(outEdge: String) extends Operation[GraphTraversal[_, Edge]]
case class InVertexOperation(inVertex: String) extends Operation[GraphTraversal[_, Vertex]]
case class OutVertexOperation(outVertex: String) extends Operation[GraphTraversal[_, Vertex]]
case class AsOperation(as: String) extends Operation[GraphTraversal[_, _]]
case class SelectOperation(select: List[String]) extends Operation[GraphTraversal[_, _]]

object Operation {
  def identity: FreeOperation[GraphTraversal[_, _]] = Free.liftF(IdentityOperation)
  def label(v: String): FreeOperation[GraphTraversal[_, Vertex]] = Free.liftF(LabelOperation(v))
  def has(h: String, w: List[_]): FreeOperation[GraphTraversal[_, Vertex]] = Free.liftF(HasOperation(h, w))
  def in(i: String): FreeOperation[GraphTraversal[_, Vertex]] = Free.liftF(InOperation(i))
  def out(o: String): FreeOperation[GraphTraversal[_, Vertex]] = Free.liftF(OutOperation(o))
  def inEdge(ie: String): FreeOperation[GraphTraversal[_, Edge]] = Free.liftF(InEdgeOperation(ie))
  def outEdge(oe: String): FreeOperation[GraphTraversal[_, Edge]] = Free.liftF(OutEdgeOperation(oe))
  def inVertex(iv: String): FreeOperation[GraphTraversal[_, Vertex]] = Free.liftF(InVertexOperation(iv))
  def outVertex(ov: String): FreeOperation[GraphTraversal[_, Vertex]] = Free.liftF(OutVertexOperation(ov))
  def as(a: String): FreeOperation[GraphTraversal[_, _]] = Free.liftF(AsOperation(a))
  def select(s: List[String]): FreeOperation[GraphTraversal[_, _]] = Free.liftF(SelectOperation(s))
}

def operationInterpreter(traversal: GraphTraversal[_, _]): (Operation ~> Id) =
  new (Operation ~> Id) {
    def apply[A](input: Operation[A]): Id[A] =
      input match {
        case IdentityOperation => traversal.asInstanceOf[A]
        case LabelOperation(label) => traversal.hasLabel(label).asInstanceOf[A]
        case HasOperation(has, within) => traversal.has(has, P.within(within: _*)).asInstanceOf[A]
        case InOperation(in) => traversal.in(in).asInstanceOf[A]
        case OutOperation(out) => traversal.out(out).asInstanceOf[A]
        case InEdgeOperation(inEdge) => traversal.inE(inEdge).asInstanceOf[A]
        case OutEdgeOperation(outEdge) => traversal.outE(outEdge).asInstanceOf[A]
        case InVertexOperation(inVertex) => traversal.inV().asInstanceOf[A]
        case OutVertexOperation(outVertex) => traversal.outV().asInstanceOf[A]
        case AsOperation(as) => traversal.as(as).asInstanceOf[A]
        case SelectOperation(select) => {
          if (select.isEmpty) {
            traversal
          } else if (select.size == 1) {
            traversal.select[Any](select.head).asInstanceOf[A]
          } else {
            traversal.select[Any](select.head, select.tail.head, select.tail.tail: _*)
          }
        }
      }
  }

私はそれをそのように呼んでプログラムを作成することができます:

def selectQuery: Free[Operation, GraphTraversal[_, _]] =
  for {
    _ <- label("person")
    _ <- as("people")
    _ <- outEdge("created")
    _ <- has("weight", List(1.0))
    _ <- inVertex("software")
    _ <- as("software")
    x <- select(List("people", "software"))
  } yield x

val traversal = graph.traversal.V()
val result = selectQuery.foldMap(operationInterpreter(traversal))

涼しい!しかし、ここに問題があります:

私が持っているList[Operation]私はそれをどのように行うのか...私はこのモナドの構造に変換したいということを?

def composeQuery(query: List[Operation[_]]): FreeOperation[GraphTraversal[_, _]] = {
  query.foldLeft(???) (??????)
}

私の翻訳する正しい方法は何であるListのをOperations、私は私の通訳を渡すことができるという自由モナドには?

ジョン・ハンソン

Free.liftFコレクションにマップしてモナドのリストを作成し、モナドsequence関数を使用して(実際sequenceUには指摘したとおり)、モナドを順番に構成します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

gitlabランナーのリポジトリ用にフェッチするアドレスを構成するにはどうすればよいですか?

分類Dev

すべての構成引数のリストを取得するにはどうすればよいですか?

分類Dev

SAP との統合を無料でテストするにはどうすればよいですか?

分類Dev

HTML自体でイベントリスナーを構成するにはどうすればよいですか?

分類Dev

chcpuを使用してCPUのリストを構成するにはどうすればよいですか?

分類Dev

出力を構成する文字のリストから「有効」/「無効」出力を取得するにはどうすればよいですか?

分類Dev

eslint / tslintの1行のステートメントを無視するように構成するにはどうすればよいですか?

分類Dev

コンテナ化されたWebアプリのカスタムドメインを構成するにはどうすればよいですか?

分類Dev

ゲートウェイがブリッジモードのときにルーターを構成するにはどうすればよいですか?

分類Dev

独自の理解に準拠したscalaモナドを作成するにはどうすればよいですか?

分類Dev

grailsプロジェクトのSpringBatchジョブでリスナーを構成するにはどうすればよいですか?

分類Dev

Windows 2003 Serverでリモートデスクトップ接続の最大接続制限を構成するにはどうすればよいですか?

分類Dev

自分のQRコードを無料で作成するにはどうすればよいですか?

分類Dev

ScalaでReaderとWriterのモナドを使用するにはどうすればよいですか?

分類Dev

無料のマーカーを使用してリストの最初のアイテムを取得するにはどうすればよいですか?

分類Dev

無料トライアル中にBigQueryの累積クエリコストを確認するにはどうすればよいですか?

分類Dev

404する前に2つのアップストリームを試すようにNginxを構成するにはどうすればよいですか?

分類Dev

リストモナドにエラー処理を追加するにはどうすればよいですか?どのデータ型が必要ですか?

分類Dev

1つの接続で複数のPOSTリクエストを送信するようにnginxを構成するにはどうすればよいですか?

分類Dev

ローカルのChocolateyリポジトリを構成するにはどうすればよいですか?

分類Dev

文字列の別のリンクリストで構成されるリンクリストを印刷するにはどうすればよいですか?

分類Dev

すべての関数で設定を利用できるようにPythonスクリプトを構成するにはどうすればよいですか?

分類Dev

Serverless Frameworkで複数のCognitoトリガーを構成するにはどうすればよいですか?

分類Dev

特定のアドレスまたはサブネットを回避するようにdockerを構成するにはどうすればよいですか?

分類Dev

特定のアドレスまたはサブネットを回避するようにDockerを構成するにはどうすればよいですか?

分類Dev

ローカルホストでのみリッスンするようにYesodを構成するにはどうすればよいですか?

分類Dev

Powershellのスタートアップ/構成スクリプトを構成するにはどうすればよいですか?

分類Dev

異なるモナドを返すモナド関数を一般的に構成するにはどうすればよいですか?

分類Dev

「無料」レベルでAzureのサポートを受けるにはどうすればよいですか?

Related 関連記事

  1. 1

    gitlabランナーのリポジトリ用にフェッチするアドレスを構成するにはどうすればよいですか?

  2. 2

    すべての構成引数のリストを取得するにはどうすればよいですか?

  3. 3

    SAP との統合を無料でテストするにはどうすればよいですか?

  4. 4

    HTML自体でイベントリスナーを構成するにはどうすればよいですか?

  5. 5

    chcpuを使用してCPUのリストを構成するにはどうすればよいですか?

  6. 6

    出力を構成する文字のリストから「有効」/「無効」出力を取得するにはどうすればよいですか?

  7. 7

    eslint / tslintの1行のステートメントを無視するように構成するにはどうすればよいですか?

  8. 8

    コンテナ化されたWebアプリのカスタムドメインを構成するにはどうすればよいですか?

  9. 9

    ゲートウェイがブリッジモードのときにルーターを構成するにはどうすればよいですか?

  10. 10

    独自の理解に準拠したscalaモナドを作成するにはどうすればよいですか?

  11. 11

    grailsプロジェクトのSpringBatchジョブでリスナーを構成するにはどうすればよいですか?

  12. 12

    Windows 2003 Serverでリモートデスクトップ接続の最大接続制限を構成するにはどうすればよいですか?

  13. 13

    自分のQRコードを無料で作成するにはどうすればよいですか?

  14. 14

    ScalaでReaderとWriterのモナドを使用するにはどうすればよいですか?

  15. 15

    無料のマーカーを使用してリストの最初のアイテムを取得するにはどうすればよいですか?

  16. 16

    無料トライアル中にBigQueryの累積クエリコストを確認するにはどうすればよいですか?

  17. 17

    404する前に2つのアップストリームを試すようにNginxを構成するにはどうすればよいですか?

  18. 18

    リストモナドにエラー処理を追加するにはどうすればよいですか?どのデータ型が必要ですか?

  19. 19

    1つの接続で複数のPOSTリクエストを送信するようにnginxを構成するにはどうすればよいですか?

  20. 20

    ローカルのChocolateyリポジトリを構成するにはどうすればよいですか?

  21. 21

    文字列の別のリンクリストで構成されるリンクリストを印刷するにはどうすればよいですか?

  22. 22

    すべての関数で設定を利用できるようにPythonスクリプトを構成するにはどうすればよいですか?

  23. 23

    Serverless Frameworkで複数のCognitoトリガーを構成するにはどうすればよいですか?

  24. 24

    特定のアドレスまたはサブネットを回避するようにdockerを構成するにはどうすればよいですか?

  25. 25

    特定のアドレスまたはサブネットを回避するようにDockerを構成するにはどうすればよいですか?

  26. 26

    ローカルホストでのみリッスンするようにYesodを構成するにはどうすればよいですか?

  27. 27

    Powershellのスタートアップ/構成スクリプトを構成するにはどうすればよいですか?

  28. 28

    異なるモナドを返すモナド関数を一般的に構成するにはどうすればよいですか?

  29. 29

    「無料」レベルでAzureのサポートを受けるにはどうすればよいですか?

ホットタグ

アーカイブ