小编Oll*_*ers的帖子

多态类约束实例

我要让那些实例的所有类型EnumBounded也的实例Random.以下代码执行此操作并且应该可以正常工作(启用适当的扩展):

import System.Random

instance (Enum r, Bounded r) => Random r where
   randomR (hi, lo) = inFst toEnum . randomR (fromEnum hi, fromEnum lo)
      where inFst f (x,y) = (f x, y)
   random = randomR (maxBound, minBound)
Run Code Online (Sandbox Code Playgroud)

但我知道这是不好的风格,因为instance (Enum r, Bounded r) => Random r创建的所有实例r,只是类型检查EnumBounded,而不是仅仅把一个实例上的类型EnumBounded.这实际上意味着我正在为所有类型定义一个实例:(.

替代方案是我必须编写独立的函数来为我提供我想要的行为,并为每个我希望成为其实例的类型编写一些样板Random:

randomBoundedEnum :: (Enum r, Bounded r, RandomGen g) => g -> (r, …
Run Code Online (Sandbox Code Playgroud)

haskell types typeclass instances

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

我应该在Haskell中制作模块有多小?

我正在Haskell写一个蛇游戏.这些是我的一些东西:

  • Coord数据类型
  • Line数据类型
  • Rect数据类型
  • 一个Polygon类型类,它允许我获得Rect一系列的行([Line]).
  • 一个Impassable类型类,它允许我获得Line一系列Coords([Coord]),以便我可以检测其他Impassables 之间的冲突.
  • Draw我要绘制到屏幕的任何内容的类型类(HSCurses).
  • 最后我使用的是QuickCheck,所以我想Arbitrary为很多这些东西声明实例.

目前我有很多这些在单独的模块中,所以我有很多小模块.我注意到我必须互相导入很多这样的东西,所以我有点想知道重点是什么.

我对Arbitrary实例感到特别困惑.在使用-Wall时,当我将这些实例放在一个测试文件中时,我得到关于孤立实例的警告,我的理解是我可以通过将这些实例放在与定义数据类型的模块相同的模块中来避免该警告但是我需要import Test.QuickCheck对于所有那些看似愚蠢的模块,因为只有在构建测试可执行文件时才需要QuickCheck.

有关QuickCheck特定问题的任何建议都将受到赞赏,因为有关如何/何地将程序划分为模块的更一般问题的指导.

haskell modularity module

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

一般转换类型

我想看看是否有可能有一个类型类将一个东西转换成另一个东西,然后再从映射中转换回来[(a,b)].

这个例子应该说明我想做的事情:

data XX = One | Two | Three deriving (Show, Eq)
data YY = Eno | Owt | Eerht deriving (Show, Eq)

instance Convert XX YY where
   mapping = [(One, Eno), (Two, Owt), (Three, Eerht)]

-- // How can I make this work?:
main = do print $ (convert One :: YY) -- Want to output: Eno
          print $ (convert Owt :: XX) -- Want to output: Two
Run Code Online (Sandbox Code Playgroud)

这是我努力做到这一点:

{-# LANGUAGE MultiParamTypeClasses #-}    
import Data.Maybe(fromJust)

lk …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass

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

开放流是否在C中的SIGINT上自动刷新和关闭?

我在一个手册页中读到,当exit()调用时,所有流都会被刷新并自动关闭.起初我对这是怎么做以及它是否真的可靠而持怀疑态度,但看到我再也找不到它我会接受它只是有效 - 我们会看到是否有任何事情发生.无论如何,如果存在这种流关闭行为,exit()这种行为也会出现在默认处理程序中SIGINT(通常用Ctrl + C触发中断信号)?或者,是否有必要做这样的事情:

#include <signal.h>
#include <stdlib.h>

void onInterrupt(int dummy) { exit(0); }

int main() {
   signal(SIGINT, onInterrupt);
   FILE *file = fopen("file", "a");
   for (;;) { fprintf(file, "bleh"); } }
Run Code Online (Sandbox Code Playgroud)

file正确关闭?或者可以安全地省略signal(SIG...void onInterrupt(...线路?

请限制对C,C99和POSIX的任何回复,因为我没有使用GNU libc.谢谢.

c posix signals

4
推荐指数
2
解决办法
1125
查看次数

O(1)随机插入/删除和O(1)随机访问的数据结构是什么?

我不知道用于此问题的数据结构.我希望结构具有:

  • 恒定时间插入或删除.
  • 通过id进行恒定时间检索.

实际系统是:

我有一堆对象,每个对象都有一个唯一的id.我的程序需要接收id的请求并返回相关对象.

每当它收到我想要的请求时:搜索结构以查看它是否在那里.如果是,请退货.如果不是,请将其从磁盘加载到内存中(将其放入结构中,以便下次请求时不必使用磁盘)然后将其返回.

我正在使用C.

这是一个类似的问题,但我不确定它是多么相关.

c performance data-structures

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

在Ruby中,如何在从文字创建的核心类的新对象中初始化实例变量

class Object
  attr_reader :foo
  def initialize
    @foo = 'bar'
  end
end

Object.new.foo # => 'bar'
''.foo # => nil
//.foo # => nil
[].foo # => nil
Run Code Online (Sandbox Code Playgroud)

我希望他们都回来 'bar'

我知道你已经可以这样做了:

class Object
  def foo
    'bar'
  end
end
Run Code Online (Sandbox Code Playgroud)

但我特别想初始化一个状态变量.另请注意,这不起作用.

class String
  alias_method :old_init, :initialize
  def initialize(*args)
    super
    old_init(*args)
  end
end

class Object
  attr_reader :foo
  def initialize
    @foo = 'bar'
    super
  end
end

''.foo # => nil
Run Code Online (Sandbox Code Playgroud)

这也不是:

class String
  attr_reader :foo
  def initialize
    @foo = 'bar'
  end
end

''.instance_variables # => …
Run Code Online (Sandbox Code Playgroud)

ruby oop

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

在git中恢复以前删除的代码(不一定是单个或整个文件)

我在一段时间后从我的代码中删除了一个类,并提交了删除.该功能是作为具有BDD样式规范的单个类实现的,并且在使用该功能时,在删除提交中更改了一些其他类.提交是干净的,因为提交中唯一的更改是删除这一个功能.

现在,我已经改变了主意,并决定只是因为我删除它才恢复功能我已经做了一大堆更改.(我知道这是一种可能性,但我没有保留副本,因为我知道我可以将其从版本控制中删除).我找到了提交:cb2a6b1我可以在以下时看到删除的行:git show cb2a6b1.问题是我现在如何将这些行应用到我的代码中?

git diff cb2a6b1 cb2a6b1~1生成一个diff,它将删除作为一个补充重新定义,但它不会git apply,主要是因为行号已经改变.我可以通过一些手动文本编辑手动将这些东西重新放入,但是有更自动的替代方案吗?

git dvcs

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