>
我知道nullable
有点像Haskell中的maybe
,绑定几个maybe
操作表示一组可能在任何时候失败的操作。我知道list monad(IEnumerable
)表示不确定性。我甚至有点理解func
作为单子(reader
monad)的功能。懒惰
和任务
的单子符号是什么?绑定它们是什么意思?
在.NET中,有没有人有更多类似单子的类型示例?
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% 的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。 所以,这篇文章,认真阅读一遍就好了。 目录