小编Saf*_*ron的帖子

Haskell:并行计算和 monad 的“顺序属性”

我很困惑为什么 REPA 函数computeP将其结果打包在一个 monad 中。它具有以下类型签名。

computeP :: (Load r1 sh e, Target r2 e, Source r2 e, Monad m) =>
            Array r1 sh e -> m (Array r2 sh e)
Run Code Online (Sandbox Code Playgroud)

本教程中它说

这样做的原因是monad 给出了一个明确定义的序列概念,因此计算 P 强制在 monadic 计算的特定点完成并行评估。

同样,Stack Overflow 上的这个答案指出

Repa 中的并行计算必须是 monadic 的原因部分与懒惰有关,但主要是因为 Repa 无法处理嵌套并行性。Monad 的顺序属性在很大程度上解决了这个问题[.]

问题

  • 拥有这个“顺序属性”究竟意味着什么?
  • 一个 monad 如何执行这个?
  • 例如computeP:对使用哪个 monad 没有限制,所以我可以使用身份 monad。那么可以使用下面的函数来代替解包 monad,还是会因为它缺少这个顺序属性而产生意想不到的结果?如果可以的话,甚至有必要使用 monad 吗?

    import Data.Functor.Identity
    import Data.Array.Repa.Eval
    import Data.Array.Repa
    
    myComputeP :: (Load …
    Run Code Online (Sandbox Code Playgroud)

monads haskell repa

6
推荐指数
1
解决办法
206
查看次数

Nestjs:测试时无法注入 ConfigService

ConfigService我在设置使用来设置 TypeORM 的单元测试时遇到问题。下面的测试失败并显示以下消息:

Nest 无法解析 TypeOrmModuleOptions 的依赖关系(?)。请确保索引 [0] 处的参数 ConfigService 在 TypeOrmCoreModule 上下文中可用。

我尝试过将其添加ConfigService为提供者,但没有成功。关于我做错了什么有什么想法吗?

import { ConfigModule, ConfigService } from '@nestjs/config';
import { Test } from '@nestjs/testing';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';

describe('TypeORM setup', () => {
    beforeEach(async () => {
        await Test.createTestingModule({
            providers: [ConfigService],
            imports: [
                ConfigModule.forRoot(),
                TypeOrmModule.forRootAsync({
                    useFactory: (config: ConfigService) => ({ ...config.get('db') }),
                    inject: [ConfigService],
                }),
            ],
        }).compile();
    });

    it('dummy', () => {
        true === true;
    });
});
Run Code Online (Sandbox Code Playgroud)

dependency-injection typescript jestjs typeorm nestjs

6
推荐指数
1
解决办法
6118
查看次数

结构和接口中的C#getters/setter

我来了(根据我)C#中的结构和接口之间的奇怪区别.考虑这个接口和结构:

public interface INumber
{
    void ChangeNumber(int n);
    void Log();
}
public struct Number : INumber
{
    private int n;
    public void ChangeNumber(int n)
    {
        this.n = n;
    }
    public void Log()
    {
        Console.WriteLine(this.n);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个具有Number作为属性的新类时,使用ChangeNumber方法将n更改为2并使用Log打印该数字,它将打印0:

public class NumberContainer
{
    public Number Number { get; set; }
    public NumberContainer()
    {
        this.Number = new Number();
        this.Number.ChangeNumber(2);
        this.Number.Log();              //prints 0...
    }
}
Run Code Online (Sandbox Code Playgroud)

过了一会儿,我意识到这是因为当我调用时this.Number.ChangeNumber(2);,我实际创建了一个新对象(因为getter)并将该数字更改为2.但后来我通过将Number属性更改为INumber属性来更改了一些代码:

public class NumberContainer
{
    public INumber Number { get; set; }
    public NumberContainer()
    {
        this.Number = …
Run Code Online (Sandbox Code Playgroud)

c# getter struct interface

5
推荐指数
1
解决办法
4962
查看次数

C#最有效的数据结构插入和删除下半部分

想象一下,我有一个很大的整数排序列表(> 1000项).我需要能够在此列表上执行两个操作:删除下半部分并通过插入随机整数将列表再次填充到其原始大小.因为我做了大约一百万次这些操作,所以我需要它尽可能高效.

我做的第一件事就是使用List我通过在正确的位置添加新项目进行排序的方法.虽然删除排序列表的下半部分非常容易,但插入需要相当长的时间.

我尝试实现一个跳过列表,但经过一些测试后,列表的大小似乎必须至少为10000才真正重要,否则它的表现甚至比我的正常列表更糟糕.

这就是为什么我决定使用AVL树,所以我可以更快,更快地插入项目.但问题是我不知道删除这种二叉搜索树的下半部分的任何有效方法.

我的问题是:有没有一种有效的方法来做到这一点?还有其他我可以更轻松使用的数据结构吗?

编辑

如上所述,我做了一个小测试,显示了列表,跳过列表和AVL树之间的性能差异.我在msdn:Skip list tutorial上使用本教程制作了跳过列表.AVL树来自这里:AVL树.我在dropbox上传了测试:示例.还有关于pastebin:程序.

在测试中,我在计时时为每个数据结构添加了10万个项目.在我的电脑上,列表大约需要1秒,跳过列表需要0.5秒,AVL树需要0.045秒.如果我按照我的意愿做了一百万次,那么这个列表大约需要11.5天,但AVL树只需要大约半天.这个时间差异清楚地表明了我希望它有效的原因.

c# avl-tree binary-search-tree data-structures

5
推荐指数
1
解决办法
2568
查看次数

Haskell 将不确定性与错误处理相结合

假设我正在创建一个可以抛出错误的简单解释器,例如

type Error = String

data Term = Con Int | Div Term Term

eval :: (MonadError Error m) => Term -> m Int
eval (Con a) = return a
eval (Div u v) = do
  a <- eval u
  b <- eval v
  if b == 0 then
    throwError "Division by zero"
  else
    return $ a `div` b
Run Code Online (Sandbox Code Playgroud)

具体错误处理程序的典型选择是Either Error.

runEval :: Term -> Either Error Int
runEval = eval
Run Code Online (Sandbox Code Playgroud)

现在假设我想扩展这个解释器来处理非确定性。例如,我可以添加一个Choice Term Term可以评估其第一个或第二个参数的术语。

data Term …
Run Code Online (Sandbox Code Playgroud)

monads haskell non-deterministic monad-transformers

5
推荐指数
1
解决办法
204
查看次数

OpenCL何时使用全局,私有,本地,恒定地址空间

我正在尝试学习OpenCL,但是我很难确定要使用的地址空间,因为我只能找到汇编资源来声明这些地址空间是什么,而不是它们为什么存在或何时使用它们。资源至少太分散了,因此我希望将所有这些信息汇总在一起:所有的地址空间是什么,它们为什么存在,何时使用哪个地址空间,以及在内存和性能方面的优缺点是什么?

据我了解(可能过于简化),GPU具有两种物理类型的内存:全局内存,远离实际处理器,因此速度较慢,但​​很大,可供所有工作人员使用;而本地内存则接近实际处理器,但速度很快,但体积很小,其他工作人员无法访问。

直观上,local限定符确保将变量放置在本地内存上,而global限定符确保将变量放置在全局内存上,尽管我不确定这是否会发生。剩下privateconstant限定词。这些的目的是什么?

也有一些隐式的限定词。例如,我认为规范提到了通用地址空间,该地址空间用于没有限定符的参数。这到底是做什么的?然后还有局部函数变量。这些地址的空间是什么?

这是一个使用我的直觉的示例,但是不知道我实际上在做什么:

示例: 假设我将类型long和长度为10000 的数组传递给内核,该内核将仅用于读取,然后我将声明它,global const因为它必须对所有工作人员都可用并且不会更改。我为什么不使用constant限定词?当通过CPU为该数组设置缓冲区时,实际上我也可以将数组设为只读,在我看来这与声明它相同const。如此反复,什么时候,为什么我会申报的东西constant还是global const

在执行内存密集型任务时,将阵列复制到内核内部的本地阵列会更好吗?我的猜测是本地内​​存太小,但是如果数组的长度只有10怎么办?阵列何时会过大/过小?更笼统:什么时候值得将数据从全局内存复制到本地内存?

假设我还想传递此数组的长度,然后将其添加const int length到内核​​的参数中,但是我不确定为什么要省略global限定符,除非我见过其他人这样做。毕竟,length所有工人都必须可以使用。如果我是对的,那么length将有一个通用的地址空间,但是同样,我真的不知道这意味着什么。

我希望有经验的人可以解决这个问题。这不仅对我来说很棒,但对希望获得一些有关GPU内存管理实践知识的其他发烧友,我也希望如此。

memory opencl memory-address

4
推荐指数
1
解决办法
2433
查看次数