小编sar*_*ara的帖子

证明自然数的类型级加法的交换性

我正在使用haskell为依赖类型编程提供的工具.我已经将一个代表自然数的GADT推广到了那个级别,并且为了增加自然数而建立了一个类型族.我还制作了你的标准"婴儿的第一个依赖类型数据类型"向量,参数化其长度和它包含的类型.代码如下:

data Nat where
    Z :: Nat
    S :: Nat -> Nat

type family (a :: Nat) + (b :: Nat) :: Nat where
    Z + n = n
    S m + n = S (m + n)

data Vector (n :: Nat) a where
    Nil :: Vector Z a
    Cons :: a -> Vector n a -> Vector (S n) a
Run Code Online (Sandbox Code Playgroud)

此外,我做了一个append函数,它采用m向量,一个n-vetor并返回一个(m + n) - 向量.这可以和人们希望的一样有效.然而,只是为了它,我试图翻转它,所以它返回一个(n + m) - 矢量.这会产生编译器错误,因为GHC无法证明我的添加是可交换的.我还是比较新的打字家庭,所以我不知道如何自己写这个证明,或者如果你甚至可以用haskell做的话.

我最初的想法是以某种方式利用类型相等约束,但我不确定如何前进.

所以要明确:我想写这个功能

append :: Vector m a …
Run Code Online (Sandbox Code Playgroud)

haskell type-theory dependent-type

12
推荐指数
1
解决办法
297
查看次数

VS2015无法构建任何项目

我不确定这是怎么回事,但截至今天,我无法在Visual Studio 2015(社区版)中构建任何东西.

即使创建一个全新的项目,控制台,winforms,类lib没有任何区别,我尝试构建时得到的只是臭名昭着的"操作无法完成"弹出窗口.我曾尝试在项目属性中禁用visual studio托管过程,但无济于事.

这真是令人沮丧,因为我现在无法真正处理任何项目.感觉这应该是一个众所周知的问题,但在这里搜索和谷歌只能得到模糊相似的结果,但我找不到任何完全匹配的东西.

请告知我是否可以访问错误日志或类似内容以提供更多信息.

visual-studio visual-studio-2015

6
推荐指数
0
解决办法
1857
查看次数

如何获取堆栈构建/安装以包含资源文件(配置,图像等)

在拾取堆栈作为开始编写非平凡的haskell程序(大于单个文件)的一步之后,我遇到了不知道如何获取堆栈以识别.ini文件等问题.它似乎不适合.cabal或stack.yaml文件中的任何位置.

为了澄清:在运行堆栈构建/安装之后,具有生成的.exe的文件夹没有资源,因此程序崩溃时会出现一堆IO错误(找不到文件).

haskell haskell-stack

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

NSubstitute - 使成员返回 lambda 调用的结果

我们都知道为替代品指定返回值的标准方式:

mySubstitute.Method().Returns(myValue);
Run Code Online (Sandbox Code Playgroud)

我需要在每次调用时计算 myValue,而不仅仅是一次。这可能吗?

例子:

mySubstitute.Method().Returns(() => ComputeValueBasedOnSystemClockAndTheWeather());
Run Code Online (Sandbox Code Playgroud)

当然这不会编译,因为Method()它并没有真正返回一个 lambda。

c# mocking nsubstitute

3
推荐指数
1
解决办法
531
查看次数

尽管是ConfigureAwait,但ASP.NET死锁(false)

编辑:我现在已经解决了这个问题,只需将按钮单击处理程序标记为async void并等待该任务.我认为除了与RegisterAsyncTask一起使用外,WebForms无法以任何方式处理异步.虽然这解决了我的问题,但我仍然对以下代码死锁的原因感兴趣,因为它违背了我目前对异步C#代码如何工作的理解,所以答案仍然受到赞赏.

我有一个服务暴露异步方法,该方法向某些api发送请求.此方法在webforms代码隐藏中使用.我知道ASP.NET只允许一次执行一个线程,因此调用Task.Wait()会导致死锁,因为等待的任务在完成后无法恢复执行,因为上下文线程被阻止.

然而,我的理解(从阅读本博客)调用ConfigureAwait(false)等待的任务导致任务在线程池线程上运行,因此可以恢复在上下文线程上的执行.我仍然从下面的代码中遇到了僵局.为什么是这样?

protected void Activate(object sender, CommandEventArgs e)
{
    var someID = int.Parse((string) e.CommandArgument);
    DoAsyncThingWithID(someID).Wait();
}

private async Task DoAsyncThingWithID(int ID)
{
    try
    {
        await new SomeService()
            .DoSomeAsyncWork(ID)
            .ConfigureAwait(false);
    }
    catch (AppropriateException e)
    {
        DealWithIt();
    }
}
Run Code Online (Sandbox Code Playgroud)

可能需要注意:DoSomeAsyncWork(int)在其下面有更多的异步方法.在底部有一个api包装对象(负责发送HTTP请求),其方法不是异步,但是调用了Task.Run(() => api.SendThingy());

这可能是问题吗?

c# asp.net deadlock task async-await

2
推荐指数
1
解决办法
757
查看次数

NSubstitute - 伪造一个调用另一个虚拟方法的虚拟方法

我有一堂课看起来像这样:

public class MyClass
{
    public virtual bool A()
    {
        return 5 < B();
    }

    protected virtual int B()
    {
        return new Random.Next(1, 10);
    }
}
Run Code Online (Sandbox Code Playgroud)

在为其编写测试时,MyClass能够执行以下操作会很方便:

[Fact]
public void Blabla()
{
    var o = Substitute.ForPartsOf<MyClass>();
    o.A().Returns(true);

    Assert.True(o.DoSomethingElse());
}
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用。我收到运行时异常:

NSubstitute.Exceptions.CouldNotSetReturnDueToTypeMismatchException

无法为 MyClass.A 返回 Boolean 类型的值(预期类型为 int)。

有没有办法解决这个问题,或者我是否必须创建一个具体的测试双类覆盖A

c# unit-testing nsubstitute

2
推荐指数
1
解决办法
2576
查看次数

在ghci中调用来自泛型函数的结果的show

当你使用特定类型类的函数时,我对GHCI中的这个东西感到有点困惑,但没有指定你想要的具体类型.请考虑以下代码:

pure (1+) <*> pure 1
> 2
Run Code Online (Sandbox Code Playgroud)

我理解它的方式,当你在GHCI中键入内容时,它会评估表达式并调用putStrLn . show它.但是如何评估呢?为什么这2?我的意思是,它是有意义的,对于大多数应用实例来说它可能是2,但是没有办法确定,对吧?如果我们检查表达式的类型,我们得到:

pure (1+) <*> pure 1 :: (Num b, Applicative f) => f b
Run Code Online (Sandbox Code Playgroud)

好吧,公平,类型看起来合理,但是从来没有指定任何类型类实例,所以GHCI/Haskell如何知道在写pure/ 时要调用什么函数<*>

来自其他语言的直觉告诉我这应该是一个错误.有点像试图用OOP语言静态调用实例方法(显然不一样,但这是我得到的那种感觉).

这里发生了什么?

haskell typeclass

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

C文件读取循环总是打破

一直在寻找C,我正在研究一个简单的程序来读取文本文件,应用caesar密码,并写入新的输出文件.我的问题是,应该构建我的输出字符串的while循环立即终止,声称下一个字符是EOF,即使它显然不是.代码如下:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

#define MORD ".mord"

void die(const char *message)
{
  if(errno) {
    perror(message);
  } else {
    printf("ERROR: %s\n", message);
  }

  exit(1);
}

int main(int argc, char *argv[])
{
  if(argc != 3) die("USAGE: dodsmord <filename> <offset>");
  char *infilename = argv[1];
  char *outfilename = strcat(infilename, MORD);
  int offset = atoi(argv[2]);
  char *outstr[1000];
  FILE *infile = fopen(infilename, "r+");
  FILE *outfile = fopen(outfilename, "w+");
  if(infile == NULL) {
    die("Could not open input file");
  }
  if(outfile == NULL) …
Run Code Online (Sandbox Code Playgroud)

c fopen eof

0
推荐指数
1
解决办法
289
查看次数