小编Mar*_*nek的帖子

光滑的外部连接与多个表

在两个表之间进行外连接很简单:

tblA.leftJoin(tblB).on(_.aId === _.bId)
Run Code Online (Sandbox Code Playgroud)

但是当在5个表之间进行连接时,它很快变得笨拙:

tblA.leftJoin(tblB).on(_.aId === _.bId).
    leftJoin(tblC).on(_._1.aId === _.cId).
    leftJoin(tblD).on(_._1._1.aId === _.dId).
    leftJoin(tblE).on(_._1._1._1.aId === _.eId)
Run Code Online (Sandbox Code Playgroud)

元组访问器变得有点混乱,特别是如果它们不能访问第一个表.

有没有更好的办法?

内部联接在语义上等效于带有过滤器的flatMap这一事实解决了内部联接的这个问题:

for {
    a <- tblA
    b <- tblB if a.aId === b.bId
    c <- tblC if a.aId === c.cId
    d <- tblD if a.aId === d.dId
    e <- tblE if a.aId === e.eId
} yield ???
Run Code Online (Sandbox Code Playgroud)

外连接是否有类似的优雅语法?

scala slick

14
推荐指数
1
解决办法
3094
查看次数

将高阶函数提升为monad

假设我有一个更高阶的函数,它使用它从函数参数中检索的值执行一些计算.

f :: a -> (b -> c) -> d
Run Code Online (Sandbox Code Playgroud)

其中a,b,c,d是一些具体类型.

然后我有这种类型的功能

g :: b -> m c
Run Code Online (Sandbox Code Playgroud)

其中m是一些monad.

现在有一种方法可以使用g和f.那就是把f变成一个产生m d代替的函数,d并且可以使用g作为它的第二个参数?

一个具体的例子是m是IO monad,f是计算从其功能参数检索的n个数字的总和的函数,g从标准输入读取数字.

f n g = sum $ map g (1..n)
g :: Int -> IO Int
g _ = readLn
Run Code Online (Sandbox Code Playgroud)

我知道有一些函数可以将标准输入转换为惰性列表,这可以解决这个问题,但我的实际情况并不那么简单.

假设我有一个在图上做某事的算法.该算法使用功能参数来确定节点的邻居.这样我就可以有多个图形实现.

现在我想将此算法与非确定性图形(List monad)或未完全已知的图形(可能是monad)一起使用.我知道我可以重写算法使用monads然后使用身份monad作为基本情况,但这是唯一的方法吗?我认为编写没有monad的算法会更容易.

这种行为可能吗?我找不到它不应该的原因,但我无法找到一种方法.

monads haskell functional-programming

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

通过 observable 限制重放缓冲区

我有一个包含实时数据的流,以及一个基本上分隔属于一起的实时数据部分的流。现在,当有人订阅实时数据流时,我想重播他们的实时数据。但是,我不想记住所有实时数据,只记住自上次其他流发出值以来的部分。

有一个问题可以解决我的问题,因为有一个重播操作符完全符合我的要求(或者至少我认为)。

目前有什么方法可以轻松做到这一点?有没有比以下更好的方法?

private class ReplayWithLimitObservable<TItem, TDelimiter> : IConnectableObservable<TItem>
{
    private readonly List<TItem> cached = new List<TItem>();
    private readonly IObservable<TDelimiter> delimitersObservable;
    private readonly IObservable<TItem> itemsObservable;
    public ReplayWithLimitObservable(IObservable<TItem> itemsObservable, IObservable<TDelimiter> delimitersObservable)
    {
        this.itemsObservable = itemsObservable;
        this.delimitersObservable = delimitersObservable;
    }

    public IDisposable Subscribe(IObserver<TItem> observer)
    {
        lock (cached)
        {
            cached.ForEach(observer.OnNext);
        }

        return itemsObservable.Subscribe(observer);
    }

    public IDisposable Connect()
    {
        var delimiters = delimitersObservable.Subscribe(
            p =>
                {
                    lock (cached)
                    {
                        cached.Clear();
                    }
                });
        var items = itemsObservable.Subscribe(
            p =>
                {
                    lock (cached)
                    {
                        cached.Add(p); …
Run Code Online (Sandbox Code Playgroud)

c# system.reactive

4
推荐指数
1
解决办法
425
查看次数

如果没有DataKinds,如何使值依赖于其他值?

我有一个Universe类型和一个worker类型.工人可以改变宇宙.我想要实现的是确保宇宙只能由来自该宇宙的工人(未来或过去的工人)修改.

我能做到的最好的是:

{-# LANGUAGE DataKinds       #-}
{-# LANGUAGE KindSignatures  #-}

module Module(initialUniverse, doSomething, doStep) where

data Nat = Z | S Nat

data Universe (t :: Nat) = Universe {
  _allWorkers :: [Worker t]
}

data Worker (t :: Nat) = Worker

initialUniverse :: Universe Z
initialUniverse = Universe [Worker]

doSomething :: Worker t -> Universe t -> Universe (S t)
doSomething = undefined

doStep :: Universe t -> Universe (S (S t))
doStep u = let w = head …
Run Code Online (Sandbox Code Playgroud)

haskell data-kinds

4
推荐指数
1
解决办法
92
查看次数

在宏中查找方法参数的实际类型

假设我有一个宏实现

def testImpl[T](c:Context)(implicit wtt:c.WeakTypeTag[T]):c.Tree = {
    import c.universe._

    def info(msg: Any) = c.info(c.enclosingPosition, msg.toString, true)

    val parameter = wtt.tpe.member(TermName("f")).paramLists(0)(0)

    info(parameter.typeSignature)

    q"{}"
}
Run Code Online (Sandbox Code Playgroud)

和宏定义

def test[T]:Unit = macro DerivingImpl.testImpl[T]
Run Code Online (Sandbox Code Playgroud)

此宏f在其类型参数中查找函数,并打印有关其第一个参数类型的信息.

现在如果我像这样使用这个宏

trait Trait[A] {
    def f(x:A): Int
}

test[Trait[Int]]
Run Code Online (Sandbox Code Playgroud)

我被A打印了.我想得到Int.我理解调用member返回的方法符号没有关于具体应用类型的信息.那么,找到参数的实际类型的正确方法是什么?

谢谢.

scala scala-macros

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

在吸气剂和定位器期间组成具有外部类型的镜片

假设我有一个函数,它使用外部值中的其他内部值来提取一些内部值

func :: outer -> inner1 -> inner2
Run Code Online (Sandbox Code Playgroud)

然后我有一个函数,使用这个inner2值在外部值和其他值之间创建一个镜头

existingLensFunc :: inner2 -> Lens' outer result
Run Code Online (Sandbox Code Playgroud)

有没有办法创建另一个函数,使用inner1值在外部值和结果值之间创建一个镜头?

finalLens :: inner1 -> Lens' outer result
Run Code Online (Sandbox Code Playgroud)

换句话说,有更好的方法来写这个吗?

finalLens inner1 = lens getter setter
  where setter outer result = let inner2 = func outer inner1 in set (existingLens inner2) result outer
        getter outer = let inner2 = func outer inner1 in view (existingLens inner2) outer
Run Code Online (Sandbox Code Playgroud)

haskell haskell-lens

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