小编Sle*_*dge的帖子

Scala表达式之间的区别

直到最近,我的理解是下面的两个Scala语句是可以互换的.

expr.op(arg1, arg2,...)
expr op (arg1, arg2,...)
Run Code Online (Sandbox Code Playgroud)

但是我正在玩scala meta,看看它们产生的AST,

Term.Apply(Term.Select(<exprTerm>, Term.Name("op")), Seq(<argTerm1>, <argTerm2>,...))
Term.ApplyInfix(<exprTerm>, Term.Name("op"), Nil, Seq(<argTerm1>, <argTerm2>,...))
Run Code Online (Sandbox Code Playgroud)

Nil在AST中找到了中缀表达式.进一步挖掘,我发现中缀选项允许类型参数:

expr op [Type1, Type2,...] (arg1, arg2,...)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我不明白他们的目的是什么.什么时候它们会有用?为什么他们允许中缀操作但不允许"应用选择"操作(expr.op(arg1, arg2,...))?

scala scalameta

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

递归可以脱糖吗

一个递归语句可以被分解为一系列>>=语句吗?如果是这样,当它被脱糖时,反向状态 monad 的定义是>>=什么样的?

instance MonadFix m => Monad (StateT s m) where
  return x = ...
  m >>= f = StateT $ \s -> do
    rec
      (x, s'') <- runStateT m s'
      (x', s') <- runStateT (f x) s
    return (x', s'')
Run Code Online (Sandbox Code Playgroud)

recursion haskell

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

标签 统计

haskell ×1

recursion ×1

scala ×1

scalameta ×1