当前位置: 首页 > 知识库问答 >
问题:

一元。NET类型

姬银龙
2023-03-14
    null

>

  • 我知道nullable 有点像Haskell中的maybe,绑定几个maybe操作表示一组可能在任何时候失败的操作。我知道list monad(IEnumerable )表示不确定性。我甚至有点理解func作为单子(readermonad)的功能。懒惰 任务 的单子符号是什么?绑定它们是什么意思?

    在.NET中,有没有人有更多类似单子的类型示例?

  • 共有1个答案

    甄坚白
    2023-03-14

    Haskell在默认情况下有Lazily,所以在Haskell中这并不是很有启发性,但是我仍然可以展示如何将任务实现为monads。以下是如何在Haskell中实现它们:

    import Control.Concurrent.Async (async, wait)
    
    newtype Task a = Task { fork :: IO (IO a) }
    
    newTask :: IO a -> Task a
    newTask io = Task $ do
        w <- async io
        return (wait w)
    
    instance Monad Task where
        return a = Task $ return (return a)
        m >>= f  = newTask $ do
            aFut <- fork m
            a    <- aFut
            bFut <- fork (f a)
            bFut
    

    为了方便起见,它构建Async库上,但不必如此。Async函数所做的全部工作就是派生一个线程来计算一个操作,并返回一个将来值。我只是定义了一个小的包装器,这样我就可以定义一个monad实例。

    使用此API,您可以轻松地定义自己的任务,只需在任务运行时提供您想要分叉的操作:

    import Control.Concurrent (threadDelay)
    
    test1 :: Task Int
    test1 = newTask $ do
        threadDelay 1000000  -- Wait 1 second
        putStrLn "Hello,"
        return 1
    
    test2 :: Task Int
    test2 = newTask $ do
        threadDelay 1000000
        putStrLn " world!"
        return 2
    
    test3 :: Task Int
    test3 = do
        n1 <- test1
        n2 <- test2
        return (n1 + n2)
    

    为了证明它是有效的,我将做两个简单的测试。首先,我将派生test3,而不要求它的未来,以确保它正确地生成复合线程:

    main = do
        fork test3
        getLine -- wait without demanding the future
    

    这是正确的:

    $ ./task
    Hello,
     world!
    <Enter>
    $
    

    现在我们可以测试当我们要求结果时会发生什么:

    main = do
        fut <- fork test3
        n   <- fut  -- block until 'test3' is done
        print n
    
    $ ./task
    Hello,
     world!
    3
    $
    
     类似资料:
    • 在本章中,我们将讨论学习控制台应用程序和UWP应用程序之间的引用。 如果查看控制台应用程序的解决方案资源管理器中的引用,您将看到如下所示的.NET CoreApp。 .NETCoreApp是一个面向.NET Core应用程序的新框架。 现在,如果查看UWP应用程序的引用,它将看起来有点不同,如下所示。 这样做的主要原因是因为在UWP中有,所以回到旧的引用风格,只能使用这个工程类型定位一个框架。 虽

    • 如果按照“字节”->“短”->“int”->“长”->“浮点”->“双倍”的自动转换,那么输出应该打印“双倍”,对吗? (https://www.geeksforgeeks.org/type-conversion-java-examples/)

    • 我已经通过链接: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection 并了解到我如何为Web API使用依赖注入。 我的项目结构是 在项目“DataManagement.Repository”中,我编写了一个类“UserRepository”,在项目“DataManagement.Rep

    • 为什么是否返回浮点值?我应该在这里做什么?

    • Python 界的领袖 Tim Peters 说的: 元类就是深度的魔法,99% 的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。 所以,这篇文章,认真阅读一遍就好了。 目录