我正在编写一个库,并希望使它绝对与资源无关,这也意味着库应该使用用户提供的内存分配功能.库允许用户也设置自己的错误处理函数,这些函数以错误消息作为参数调用,如下所示:
typedef void (*error_handler)(const char* msg);
Run Code Online (Sandbox Code Playgroud)
库代码自己准备错误消息,就像那样(消息格式化失败的情况):
char buf[BUF_SIZE];
snprintf(buf, BUF_SIZE, "Oops found at file '%s' line %d", __FILE__, __LINE__);
Run Code Online (Sandbox Code Playgroud)
但是我可以确定snprintf不会为malloc的内部使用分配更多内存,显然会绕过用户提供的分配例程吗?我的Linux系统中的手册页对此保持沉默.
我正在为网格轴编写一个简单的ADT.在我的应用程序中,网格可以是常规的(在坐标之间有恒定的步长),也可以是不规则的(否则).当然,常规网格只是不规则网格的一种特殊情况,但在某些情况下可能需要区分它们(例如,执行一些优化).所以,我声明我的ADT如下:
data GridAxis = RegularAxis (Float, Float) Float -- (min, max) delta
| IrregularAxis [Float] -- [xs]
Run Code Online (Sandbox Code Playgroud)
但我不希望用户使用max < min
或使用无序xs
列表创建格式错误的轴.因此,我添加了"更智能"的构造函数,它们执行一些基本检查:
regularAxis :: (Float, Float) -> Float -> GridAxis
regularAxis (a, b) dx = RegularAxis (min a b, max a b) (abs dx)
irregularAxis :: [Float] -> GridAxis
irregularAxis xs = IrregularAxis (sort xs)
Run Code Online (Sandbox Code Playgroud)
我不希望用户直接创建网格,因此我不会将GridAxis
数据构造函数添加到模块导出列表中:
module GridAxis (
GridAxis,
regularAxis,
irregularAxis,
) where
Run Code Online (Sandbox Code Playgroud)
但事实证明,完成此操作后,我再也无法使用模式匹配GridAxis
了.试着用它
import qualified GridAxis as GA
test :: …
Run Code Online (Sandbox Code Playgroud) 一些.NET反射方法(例如,Module.ResolveField)接受所谓的标记作为参数.这些令牌只是Int32号码.我在反汇编程序中只看到了正数令牌,但一般来说,整数也可以是负数或零.假设CLR令牌只是正面是否安全?
我想从Google N-Grams数据集中提取最常用的单词,其未压缩形式大约为20 GB.我不希望使用整个数据集,只需要最频繁的5000个数据集.但如果我写
take 5000 $ sortBy (flip $ comparing snd) dataset
-- dataset :: IO [(word::String, frequency::Int)]
Run Code Online (Sandbox Code Playgroud)
这将是一个无尽的等待.但我该怎么做呢?
我知道Data.Array.MArray包可用于就地数组计算,但我在其文档页面上看不到任何修改项目的功能.还有Data.HashTable.IO,但它是一个无序的数据结构.
我想使用简单Data.IntMap.Strict
(具有方便的lookupLE
功能),但我不认为它会非常有效,因为它会在每次更改时生成一个新的地图.难道ST
单子提高吗?
UPD:我还在CoreReview.SX上发布了程序的最终版本.