lifting

    3热度

    4回答

    我写了一个斯卡拉功能: def liftOrIdentity[T](f: (T, T) => T) = (a: Option[T], b: Option[T]) => (a, b) match { case (Some(a), None) => Some(a) case (None, Some(b)) => Some(b) case (Some(a),

    6热度

    1回答

    在书Functional Programming In Scala中,有一个'Lift'的例子,其中A => B类型的函数被提升为Option[A] => Option[B]。 这是如何提升实现: def lift[A,B](f: A => B):Option[A] => Option[B] = _ map f 我对此一对夫妇的混乱: 第一个是,什么是“_”在这里吗?其次,当我从DEF删除返回

    6热度

    1回答

    我想将Haskell函数提升为更高阶的lambda微积分编码。这几乎是从Oleg的Typed Tagless Final编码逐字记录的。 class Lam r where emb :: a -> r a (^) :: r (r a -> r a) -> (r a -> r a) lam :: (r a -> r a) -> r (r a -> r a) inst

    7热度

    1回答

    我现在对单子变形金刚有一点困难。我正在定义一些使用变形金刚的不同的非确定性关系。不幸的是,我无法理解如何从一个有效的模型转换到另一个有效的模型。 假设这些关系是“foo”和“bar”。假设“foo”将As和Bs关联到Cs;假设“bar”将Bs和Cs与Ds相关联。我们将用“foo”来定义“bar”。为了使事情更有趣,这些关系的计算将以不同的方式失败。 (由于巴关系取决于foo的关系,其失败的案例是一

    1热度

    1回答

    莱昂纳多博尔赫斯撰写了一篇优秀的文章"Functional Composition With Monads, Kleislis and Functors"。 他在文中评论道: 马克指出,我认为电梯是几乎一样的地图,并反转参数。 这意味着,这样的: val f = Functor[Option].lift(parts) compose make 可重构为: val g = make(_:Int)

    3热度

    1回答

    我正在阅读关于单体变压器在真实世界哈斯克尔。在以下示例中,堆栈顶部Writer顶部State顶部Reader顶部IO。 {-# Language GeneralizedNewtypeDeriving #-} import Control.Monad import Control.Monad.State import Control.Monad.Reader import Control.

    8热度

    1回答

    我试图采用ExceptT a (StateT A M),对于某些具体类型A和monad M,并将它们包裹到我的新自定义monads中。 首先我确定了StateT A M在其他环境中经常出现,因此我决定这将是最好的单独包装在一个单子M1,然后包装成ExceptT a M1M2。 期望的特性是使MonadStateM1和M2实例和类M(让我们假设它被称为MyMonadClass)。 M2也应该是Mon

    0热度

    1回答

    所以我有这样的代码 {-# LANGUAGE GeneralizedNewtypeDeriving #-} import MonadA data A = A newtype MonadA a => MyStateT a b { runMyStateT :: StateT A a b } deriving (Functor, Applicative, Monad, MonadI

    6热度

    1回答

    比方说,我有这样的(可以说是误导)周围铺设的一段代码: import System.Environment (getArgs) import Control.Monad.Except parseArgs :: ExceptT String IO User parseArgs = do args <- lift getArgs case safeHead arg

    2热度

    1回答

    我使用在其中一个模块中定义的功能if'而不是内置的if-then-else构造。它是平凡的定义,工作得很好。 但是,在代码中有一个地方需要将它应用于monad值(我的情况为IO),即类型签名应该看起来有点像IO Bool -> IO a -> IO a -> IO a。当然,我试图解除它。 if' <$> mb <*> action1 <*> action2 但是,当我试图评估表达式,我没有得