代码之家  ›  专栏  ›  技术社区  ›  Ahmad Ismail

如何将多个值传递给一个一元函数

  •  1
  • Ahmad Ismail  · 技术社区  · 3 年前

    我有一个类似贝娄的程序。

    incVal :: Num a => a -> a
    incVal x = x + 1
    
    incVal' :: (Monad m, Num a) => a -> m a
    incVal' x = return (x + 1)
    
    incVal'' :: (Monad m, Num a) => a -> a -> m a
    incVal'' x y = return (x + y)
    
    incVal''' :: (Monad m, Num a) => a -> a -> a -> m a
    incVal''' x y z = return (x + y + z)
    
    main = do
        print(Just 9 >>= incVal')
    

    我可以调用 incVal' 具有 >>= (如上述代码所示)。但我不知道如何调用 incVal'' incVal''' 具有 >>=

    1 回复  |  直到 3 年前
        1
  •  1
  •   Fyodor Soikin    3 年前

    您可以将Applicative与 join

    首先,您可以使用 <$> <*> :

    print (incVal'' <$> Just 5 <*> Just 37)
    

    但这还不够,因为这样做的结果将是 Maybe (Maybe Int) ,由于 <*> 工作,所以上面的行将打印 "Just (Just 42)"

    因此,作为最后一步,要“unnest”该值,可以使用 the join function ,这是标准的Monad操作:

    print (join (incVal'' <$> Just 5 <*> Just 37))
    

    当然,同样的方法也适用于 incVal''' :

    print (join (incVal''' <$> Just 1 <*> Just 4 <*> Just 37))
    

    顺便说一句,甚至 incVal' 调用可以用相同的术语表示,因为 <$> (又名 fmap )以及 参加 相当于 >>= :

    print (join (incVal' <$> Just 42))
    
    推荐文章