首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Haskell中的用户输入在运行时编写函数

基于Haskell中的用户输入在运行时编写函数
EN

Stack Overflow用户
提问于 2011-07-27 22:24:11
回答 2查看 641关注 0票数 7

假设我有100个不同简单签名的函数(从单态开始,但也希望多态情况也能工作)a -> b ( Int,Int -> String,String -> Double,MyType -> MyOtherType等)。

假设我向用户显示了这些内容的列表。用户选择一个。我显示了一个函数列表,这些函数的参数与所选函数的输出兼容。用户选择一个。

现在我该如何组合这两个函数呢?一般的情况是一系列的组合,但我认为这个简单的情况涵盖了我正在处理的问题。

我知道我可以尝试unsafeCoerce或Data.Dynamic,但我正在尝试是否可以避免这一点,而且这些显然限制在单态类型上,这会导致问题。

我想也许我可以创建一个所有函数的数据结构,以及它们可以组成什么,但我不确定这一点。当包含多态情况时,这似乎是不可能的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-28 00:23:14

问题可以归结为:我如何向编译器证明这个输入和那个函数,以及我正在对该函数的输出做什么,都以一种合理的方式排列在一起?这里有几个答案。

  • 告诉编译器“请相信我”。在编译器中使用unsafeCoerce.
  • Tell“我是在猜测,但我非常确定我是对的--所以请检查我,但要在运行时,而不是在编译时。”通过案例分析在函数的a -> b类型中的ab类型上使用Data.Dynamic.
  • Do证明。
  • 承认,你正在为你自己的小语言编写解释器和类型检查器,并且做得很好,这取决于ab有多少选择,这可能有点拖后腿。创建一个语法,编写一个小解析器,创建一个AST,执行类型检查,并进行计算。GADT可以帮助您利用GHC的类型检查器,减少您必须进行的类型检查的数量(但有时会增加您必须进行的键盘输入的数量)。

作为第三个选项的示例,假设您有f :: Int -> Stringg :: Double -> Boolchoice1 :: Intchoice2 :: Intchoice3 :: Intchoice4 :: Double。你可以这样写:

代码语言:javascript
复制
main = prompt "f or g" >>= \ans -> case ans of
    "f" -> prompt "1, 2, or 3" >>= \ans -> case ans of
        "1" -> doSomethingWithString (f choice1)
        "2" -> doSomethingWithString (f choice2)
        "3" -> doSomethingWithString (f choice3)
    "g" -> prompt "4 is your only choice" >>= \ans -> case ans of
        "4" -> doSomethingWithBool (g choice4)

这种方法通常可以清理很多--例如,所有的"f“情况都可以折叠。

票数 12
EN

Stack Overflow用户

发布于 2011-07-27 22:56:55

我不确定一旦组合函数被创建,你打算如何处理它,因为它的参数和结果将具有未知的类型。我猜你可以一直向它应用参数,直到它不再是一个函数,但是你不能对结果做任何有用的事情,除非你把它限制为某个类的成员(比如Show)。

为什么要避免使用Data.Dynamic?这似乎是一个内在的动态问题。为了能够匹配兼容的函数,您需要一种将类型表示为数据的方法,因此Data.Typeable似乎是合适的。

这听起来像是你想在运行时做Haskell编译器在编译时做的事情。也许您可以使用System.Eval.Haskell动态构造代码并对其进行动态评估。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6846027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档