直到最近,我的理解是下面的两个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,...))?
一个递归语句可以被分解为一系列>>=语句吗?如果是这样,当它被脱糖时,反向状态 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)