小编fuz*_*fuz的帖子

Haskell - 如何避免一遍又一遍地键入相同的上下文?

我最近开始了一个小爱好项目,在那里我尝试实施技巧卡片游戏Skat(3名玩家).为了能够让不同类型的玩家(如AI,网络和本地)一起玩,我使用类型类设计了一个界面Player:

class Monad m => Player p m | p -> m where
  playerMessage :: Message answer -> p -> m (Either Error answer,p)
Run Code Online (Sandbox Code Playgroud)

我用a StateT来结束这三个玩家:

type PST a b c m x = StateT (Players a b c) m x
Run Code Online (Sandbox Code Playgroud)

但是现在,我必须在每个类型签名中写一大堆上下文:

dealCards :: (Player a m, Player b m, Player c m, RandomGen g)
  => g -> PST a b c m (SomeOtherState,g)
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免一次又一次地写这个大背景?

haskell

22
推荐指数
2
解决办法
1175
查看次数

在刚刚超过数组末尾的指针上调用长度为零的memcpy是否合法?

正如其他地方所解释的那样,调用memcpy无效或NULL指针等函数是未定义的行为,即使length参数为零.在这样的功能,特别是上下文memcpymemmove,是一个指针刚刚过去的阵列的有效指针的结束?

我问这个问题是因为一个指针刚好超过一个数组的末尾是合法的(相反,例如一个指针超过一个数组末尾的两个元素),但你不能取消引用它,但是脚注106 ISO 9899:2011表明这样的指针指向程序的地址空间,这是指针根据§7.1.4有效所需的标准.

这种用法发生在我希望将项目插入数组中间的代码中,要求我在插入点之后移动所有项目:

void make_space(type *array, size_t old_length, size_t index)
{
    memmove(array + index + 1, array + index, (old_length - index) * sizeof *array);
}
Run Code Online (Sandbox Code Playgroud)

如果我们想在数组的末尾插入,index则等于lengtharray + index + 1指向刚好超过数组的末尾,但复制元素的数量为零.

c pointers undefined-behavior language-lawyer

22
推荐指数
3
解决办法
4144
查看次数

Haskell编译器如何工作?

我在哪里可以得到一些论文/ doc /描述Haskell编译器实际工作方式的内容?我阅读了很多GHC的文档,但在头痛之后就停止了.因此,不需要博士学位来理解它并且不是用你应该已经熟悉的那种方式写的东西会更好.如果它真的很长并且需要一些时间来理解它,这不是问题.

PS:最有趣的是关于GHC,但一切都很好.

compiler-construction haskell language-implementation

21
推荐指数
3
解决办法
4103
查看次数

内联装配破坏了红色区域

我正在编写一个加密程序,并且核心(一个宽的乘法例程)是用x86-64汇编编写的,两者都是为了速度而且因为它广泛使用adc那些不容易从C中访问的指令.我不想内联这个函数,因为它很大,并且在内循环中被调用了好几次.

理想情况下,我还想为此函数定义一个自定义调用约定,因为它在内部使用所有寄存器(除外rsp),不破坏其参数,并在寄存器中返回.现在,它适应了C调用约定,但当然这使它变慢(大约10%).

为了避免这种情况,我可以调用它,asm("call %Pn" : ... : my_function... : "cc", all the registers);但有没有办法告诉GCC调用指令与堆栈混淆?否则GCC会将所有这些寄存器放在红色区域中,而顶部的寄存器将被破坏.我可以使用-mno-red-zone编译整个模块,但是我更喜欢告诉GCC,比方说,红色区域的前8个字节将被破坏,以便它不会放任何东西.

c x86 gcc inline-assembly red-zone

20
推荐指数
2
解决办法
1716
查看次数

一种避免常见使用unsafePerformIO的方法

我经常在Haskell代码中找到这种模式:

options :: MVar OptionRecord
options = unsafePerformIO $ newEmptyMVar

...

doSomething :: Foo -> Bar
doSomething = unsafePerformIO $ do
  opt <- readMVar options
  doSomething' where ...
Run Code Online (Sandbox Code Playgroud)

基本上,一个人有一个选项或类似的记录,最初是在程序开始时设置的.由于程序员很懒惰,他不想options在整个程序中携带记录.他定义了一个MVar保持它 - 由丑陋的使用定义unsafePerformIO.程序员确保状态只设置一次,并且在任何操作发生之前.现在程序的每个部分都必须unsafePerformIO再次使用,只是为了提取选项.

在我看来,这样的变量被认为是实用的纯粹(不要打败我).是否有一个库抽象出这个概念,并确保变量只设置一次,即在初始化之前没有调用,并且不需要写unsafeFireZeMissilesAndMakeYourCodeUglyAnd DisgustingBecauseOfThisLongFunctionName

haskell global-variables purely-functional unsafe-perform-io

16
推荐指数
3
解决办法
2375
查看次数

从Java VM无效访问堆栈红区

我试图弄清楚在Java中可能导致此错误的原因:

Invalid access of stack red zone 0x115ee0ed0 rip=0x114973900
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个错误信息?它实际上是在杀死JVM,一切都停在那里.

我目前正在使用这个版本的Java :(在OS X 10.6上)

java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03-219)
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02-90, mixed mode)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是关于如何避免再次发生这种情况的某种解释和提示.

提前致谢!

java jvm jvm-hotspot red-zone

15
推荐指数
2
解决办法
5751
查看次数

Haskell中的多变量函数

在阅读了关于在Haskell中编写多变量函数的这篇文章后,我试着写一些自己的函数.

起初我以为我会尝试概括它 - 所以我可以通过折叠参数给出一个返回可变参数函数的函数.

{-# OPTIONS -fglasgow-exts #-}
module Collapse where
class Collapse a r | r -> a where
  collapse :: (a -> a -> a) -> a -> r
instance Collapse a a where
  collapse _ = id
instance (Collapse a r) => Collapse a (a -> r) where
  collapse f a a' = collapse f (f a a')
Run Code Online (Sandbox Code Playgroud)

但是,编译器不喜欢这样:

Collapse.hs:5:9:
    Functional dependencies conflict between instance declarations:
      instance Collapse a a -- Defined at …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell polyvariadic

15
推荐指数
2
解决办法
1681
查看次数

有没有办法否定正则表达式?

给出一个描述常规语言的正则表达式R(没有花哨的反向引用).有没有一种算法来构造一个正则表达式R*来描述除R描述的所有单词之外的所有单词的语言?它应该是可能的维基百科说:

常规语言在各种操作下关闭,也就是说,如果语言KL是常规语言,则以下操作的结果也是如此:[...]补语¬L

例如,给定字母{a,b,c},语言的反转(abc*)+(a |(ac | b | c).*)?


正如DPenner在评论中已经指出的那样,正则表达式的倒数可以比原始表达式指数级大.这使得反转正则表达式不适合实现用于搜索目的的否定部分表达式语法.是否有一种算法可以保留正则表达式匹配的O(n*m)运行时特性(其中n是正则表达式的大小,m是输入的长度),并允许否定的子表达式?

regex algorithm regular-language

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

什么时候使用毫无意义的风格?

包括我在内的许多haskell程序员都喜欢无意义的风格,特别是在编写复杂的解析器时.它们使代码更具可读性和更简洁.但有时,它只是反过来(例如在滥用实例Monad和朋友时(->) a).

请给我一些基本的指导,你什么时候认为毫无意义的风格是有用的,何时不是.例如,如果我不得不使用部分组合(类似的话flip ((.) . take) . drop),我总是使用lambda .

haskell coding-style pointfree

14
推荐指数
2
解决办法
1340
查看次数

Go保证不变地址吗?

给定对象obj是有保证的

uintptr(unsafe.Pointer(&obj))
Run Code Online (Sandbox Code Playgroud)

无论何时调用,它总是会评估为相同的值?

当然,Go保证如果你把两个指针指向同一个对象,它们总是比较相等.虽然实现可以移动对象在内存中并透明地更新指向它的所有指针.

如果您考虑像Mark-and-Compact这样的垃圾收集策略,这很有趣.是否允许实现者使用这种垃圾收集策略?

garbage-collection specifications go

14
推荐指数
2
解决办法
1122
查看次数