如何使用广义代数数据类型?
haskell wikibook中给出的示例太短,无法让我了解GADT的真正可能性.
我想使用具有以下类型的Haskell函数::
string -> string来自C#程序.
我想用hs-dotnet来桥接两个世界.作者声称这是可能的,但没有提供此案例的样本.提供的唯一示例是使用Haskell的.NET的示例.
是否有此用途的样本,或如何使用它?(我在桥接组件上使用了.NET Reflector,但我不明白.)
假设我有以下类型:
data MyType = Constructor0 | Constructor1 | Constructor2
deriving (Eq,Show,Enum)
MArray (STUArray s) MyType (ST s) MArray IOUarray MyType IO
目前我将所有内容存储为Word8,然后使用(包装)fromEnum/toEnum进行转换,但感觉不对.我需要严格和拆箱,因为我在内存中使用大型数据结构(> 1.2Go),我无法懒得加载它.如果我找不到任何解决方案,我将重新实现C++中的所有内容,我希望避免使用当前项目.
我已经问了#haskell的问题,但我没有得到回复,也许这不是当天的好时机.
我目前正在为个人javascript模块添加类型注释,但是当我尝试键入函数时,我正在考虑将regexp作为参数,但以下尝试都没有工作:
/** @type {function(RegExp)} */
/** @type {function(regex)} */
Run Code Online (Sandbox Code Playgroud)
我只是得到:
WARNING - Bad type annotation. Unknown type regexp
Run Code Online (Sandbox Code Playgroud)
我应该在声明中使用什么类型?谢谢.
假设我想索引集合的所有元素并将此索引存储在地图中。一个可行的解决方案是扩展 Set 模块并创建一个内部函子:
module Make(M : Set.S) = struct
include M
module MakeIndexer(MM : Map.S with type key = elt) = struct
let index_set set =
let aux el (ix, acc) =
(ix + 1, MM.add el ix acc)
in
M.fold aux set (0, MM.empty) |> snd
end
end
Run Code Online (Sandbox Code Playgroud)
现在,内部函子的使用有点麻烦,我想使用使用一流模块的实现。到目前为止,我得到了以下信息:
module Make(M : Set.S) = struct
include M
let index_map (module MM : Map.S with type key = elt) set =
let aux el (ix, acc) =
(ix + 1, …Run Code Online (Sandbox Code Playgroud)