假设我有各种简单签名的100个函数(从单态开始,但想使多态案例也起作用)a - > b(Int - > Int,Int - > String,String - > Double,MyType - > MyOtherType等)
假设我向用户显示了这些列表。用户选择一个。我显示了一个函数列表,其参数与所选函数的输出兼容。用户选择一个。
我现在如何撰写这两个功能?一般情况是一系列的组合,但我认为这个简单的案例涵盖了我正在使用的问题。
我知道我可以尝试使用unsafeCoerce或Data.Dynamic,但是我试图看看是否可以避免这种情况,并且那些显然仅限于导致问题的单态类型。
我想也许某种程度上我可以创建所有函数的数据结构以及它们可以组成的内容,但我不确定。当包含多态案例时,似乎不可能。
答案 0 :(得分:12)
问题归结为:我如何向编译器证明此输入和该函数以及我正在使用执行该函数的输出所有人都以明智的方式排队?有几个答案。
unsafeCoerce
。Data.Dynamic
。a
类型中的b
和a -> b
类型进行案例分析。根据{{1}}和a
的选择数量,这可能会有点拖累。作为第三个选项的示例,假设您有b
,f :: Int -> String
,g :: Double -> Bool
,choice1 :: Int
,choice2 :: Int
和choice3 :: Int
。你可以这样写:
choice4 :: Double
这种方法通常可以清理很多 - 例如,所有“f”案例都可能崩溃。
答案 1 :(得分:1)
我不确定你创建的函数一旦创建后你打算做什么,因为它的参数和结果将是未知类型。我猜你可以继续向它应用参数,直到它不再是一个函数,但你不能对结果做任何有用的事情,除非你把它限制为某个类的成员(比如Show
)。
为什么要避免Data.Dynamic
?这似乎是一个固有的动态问题。为了能够匹配兼容的函数,您需要一种将类型表示为数据的方法,因此Data.Typeable
似乎是合适的。
这听起来像你想在运行时做Haskell编译器在编译时所做的事情。也许您可以动态构建代码并使用System.Eval.Haskell动态评估它。