在类型类实例中对中间值的记忆

时间:2017-03-03 15:54:52

标签: haskell typeclass

我有以下函数toTF,给定一些上下文和一个项目,给出一个消耗一个输入,一个输入状态并产生下一个状态的函数:

Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]

Compiling 3 files (.ex)

== Compilation error on file lib/test/mystuff.ex ==
** (CompileError) lib/test/mystuff.ex:1: cannot define module Test.Mystuff because it is currently being defined in lib/mystuff.ex:1
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

我正在尝试实现Token的这个东西的实例,它产生一个函数,它将令牌的文字值,词干和词性的识别器应用于,如果一切正常,则接受此令牌,否则失败。

这是我尝试过的实例声明:

class TFSource s' where
    type S s' :: *
    type I s' :: *
    type O s' :: *
    toTF :: Context -> s' -> TFSig (S s') (I s') (O s')

type TFSig s i o = [i] -> s -> Output s i o

如何确保litTF和stemTF在使用相同的ctx和令牌值的toTF调用时共享(memoized?)?

1 个答案:

答案 0 :(得分:3)

一般来说,这很难做到。

一种可能性是重构你的类型类,以便它提供一个没有参数的单个备忘录,懒惰包含所有可能的标记的结果。为此,您可以使用类似https://hackage.haskell.org/package/MemoTrie的内容。但这假设您可以将ctx实际视为地图中的某个域,这可能是不可能的。