我要让那些实例的所有类型Enum和Bounded也的实例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,只是类型检查Enum和Bounded,而不是仅仅把一个实例上的类型Enum和Bounded.这实际上意味着我正在为所有类型定义一个实例:(.
替代方案是我必须编写独立的函数来为我提供我想要的行为,并为每个我希望成为其实例的类型编写一些样板Random:
randomBoundedEnum :: (Enum r, Bounded r, RandomGen g) => g -> (r, …Run Code Online (Sandbox Code Playgroud) 我正在Haskell写一个蛇游戏.这些是我的一些东西:
Coord数据类型Line数据类型Rect数据类型Polygon类型类,它允许我获得Rect一系列的行([Line]).Impassable类型类,它允许我获得Line一系列Coords([Coord]),以便我可以检测其他Impassables 之间的冲突.Draw我要绘制到屏幕的任何内容的类型类(HSCurses).Arbitrary为很多这些东西声明实例.目前我有很多这些在单独的模块中,所以我有很多小模块.我注意到我必须互相导入很多这样的东西,所以我有点想知道重点是什么.
我对Arbitrary实例感到特别困惑.在使用-Wall时,当我将这些实例放在一个测试文件中时,我得到关于孤立实例的警告,我的理解是我可以通过将这些实例放在与定义数据类型的模块相同的模块中来避免该警告但是我需要import Test.QuickCheck对于所有那些看似愚蠢的模块,因为只有在构建测试可执行文件时才需要QuickCheck.
有关QuickCheck特定问题的任何建议都将受到赞赏,因为有关如何/何地将程序划分为模块的更一般问题的指导.
我想看看是否有可能有一个类型类将一个东西转换成另一个东西,然后再从映射中转换回来[(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) 我在一个手册页中读到,当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.谢谢.
我不知道用于此问题的数据结构.我希望结构具有:
实际系统是:
我有一堆对象,每个对象都有一个唯一的id.我的程序需要接收id的请求并返回相关对象.
每当它收到我想要的请求时:搜索结构以查看它是否在那里.如果是,请退货.如果不是,请将其从磁盘加载到内存中(将其放入结构中,以便下次请求时不必使用磁盘)然后将其返回.
我正在使用C.
这是一个类似的问题,但我不确定它是多么相关.
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) 我在一段时间后从我的代码中删除了一个类,并提交了删除.该功能是作为具有BDD样式规范的单个类实现的,并且在使用该功能时,在删除提交中更改了一些其他类.提交是干净的,因为提交中唯一的更改是删除这一个功能.
现在,我已经改变了主意,并决定只是因为我删除它才恢复功能我已经做了一大堆更改.(我知道这是一种可能性,但我没有保留副本,因为我知道我可以将其从版本控制中删除).我找到了提交:cb2a6b1我可以在以下时看到删除的行:git show cb2a6b1.问题是我现在如何将这些行应用到我的代码中?
git diff cb2a6b1 cb2a6b1~1生成一个diff,它将删除作为一个补充重新定义,但它不会git apply,主要是因为行号已经改变.我可以通过一些手动文本编辑手动将这些东西重新放入,但是有更自动的替代方案吗?