gpt4 book ai didi

frege - 类型不像建议的那样多态

转载 作者:行者123 更新时间:2023-12-03 21:28:18 26 4
gpt4 key购买 nike

我想构建一个抽象来使用不同的模板引擎:

class Template a where
process :: a -> Model -> IO String

class TemplateEngine a where
buildTemplate :: (Template b) => a -> BufferedReader -> IO b

我的第一次尝试是调整 Groovy 模板,因此我实现了所需的数据类型:
data GroovyWritable = mutable native groovy.lang.Writable where
native writeTo :: GroovyWritable -> Writer -> IO Writer
throws IOException

data GroovyTemplate = mutable native groovy.text.Template where
native make :: GroovyTemplate -> HashMap -> IO GroovyWritable

data GroovyEngine = mutable native groovy.text.markup.MarkupTemplateEngine where
native new :: () -> IO GroovyEngine
native createTemplate :: GroovyEngine -> BufferedReader -> IO GroovyTemplate
throws ClassNotFoundException, IOException

然后我做了相应的实例:
instance Template GroovyTemplate where
process template model = do -- model is not used at the moment
config <- HashMap.new ()
writable <- GroovyTemplate.make template config
stWriter <- StringWriter.new ()
writer <- writable.writeTo stWriter
writer.toString

instance TemplateEngine GroovyEngine where
buildTemplate engine reader = GroovyEngine.createTemplate engine reader

但是编译器提示:
...
type `GroovyTemplate` is not as polymorphic as suggested
in the annotation where just `α` is announced.
...
type error in expression createTemplate engine reader
type is : IO GroovyTemplate
expected: IO α

有任何想法吗 ?我应该使用不同的策略吗?
谢谢

更新 :

为了解释我要做什么,我添加了一个函数,该函数表示从给定模板引擎构建模板的通用方法。

假设我知道 Frege 需要更精确的类型,一个 TemplateEngine 的实例和一个 BufferedReader包含模板文件的内容,执行 buildTemplate给定引擎的功能应该给我一个 Template 的实例作为返回.这里的这个函数在编译时完全没有警告。
execute :: (TemplateEngine a, Template b) => a -> BufferedReader -> IO b
execute engine reader = buildTemplate engine reader

我很困惑,为什么编译器没有在这里提示?它不应该像以前一样提示吗?

更新 II(工作解决方案) :

根据 Ingo 的建议,我仔细研究了设计背后的基本原理,并找到了一个可行的解决方案。

一开始我认为拥有 TemplateEngine 会很棒type class 以相同的方式创建模板引擎实例。

但最重要的部分是有一个通用的类型类来处理模板等,因为模板可以被缓存。所以最重要的是,只要生成的模板是 Template 的实例,我就不关心模板是如何来的。 .

在这个前提下,我可以有一个通用的函数来处理模板并获得生成的 html/json/xml...等。
execute :: (Template a) => a -> Model -> IO String
execute tpl model = tpl.process model

当然是 production-ready签名应该是这样的:
execute :: (Template a) => a -> Model -> Either TemplateException String

最佳答案

我不完全确定您将要做什么,但就目前情况而言,GroovyEngine.createTemplate方法不能用于实例化 teh GroovyEngineTemplateEngine .自 buildTemplate操作 promise 返回任何 Template来电者想要,前提是 Template实例作为参数传递。

现在,这里的第一个问题是本地方法无法处理类型类约束。我们可以通过使用实际使用 Template 的 frege 函数包装对 native 方法的调用来解决这个问题。约束。但话又说回来,不清楚如何实际创建一个合适的值,因为 Template类不提供相应的操作。和 GroovyEngine.createTemplate仍然不合格,因为它总是创建一个特定的模板,而不是依赖于约束的模板。

关于frege - 类型不像建议的那样多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34870455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com