如何定义Lisp在Haskell中的应用?
|
难道不应该在像Haskell这样的懒惰的语言中使用该定义来定义函数吗?
apply f [] = f
apply f (x:xs) = apply (f x) xs
它基本上是一个将给定函数应用于给定参数列表的函数,例如在Lisp中非常容易做到。
有什么解决方法吗?
没有找到相关结果
已邀请:
8 个回复
泻伴墓荒
函数,因为它的类型取决于(可能是异构的)列表参数的类型。我可以想到至少有两种方法可以在Haskell中编写此函数: 使用反射 我们可以将应用程序的类型检查推迟到运行时:
请注意,现在Haskell程序可能会在运行时因类型错误而失败。 通过类型类递归 使用半标准的
技巧(由IIRC于augustss发明),可以将这种解决方案编码为这种样式(运动)。尽管它可能不是很有用,但仍需要一些技巧来隐藏列表中的类型。 编辑:如果不使用动态类型或hlists / existentials,我想不出一种写此方法的方法。希望看到一个例子
授巨
,在这种情况下用于部分应用,可能有点令人生畏。这是不需要任何扩展的解决方案。 首先,我们定义一个函数的数据类型,该函数知道如何处理任意数量的参数。您应在此处将ѭ5读为\“参数类型\”,将
读为\“返回类型\”。
然后,我们可以编写一些(Haskell)函数来调整这些(可变)函数。对于后奏中出现的所有功能,我都使用
后缀。
例如,
函数可被视为可变函数:
但是,我们还希望能够处理普通函数,这些函数不一定知道如何处理任何数量的参数。那么该怎么办?好吧,像Lisp一样,我们可以在运行时引发异常。下面,我们将使用ѭ12作为非变性函数的简单示例。
当然,如果您不喜欢分别定义
,
,
,
等的样板,则需要启用一些扩展。但是没有它们,您可以走得很远! 这是您可以概括为单个
函数的方法。首先,我们定义一些标准的类型级别数字:
然后介绍要提升的typeclass。您应该将类型
读取为\“
的
副本作为参数,然后返回ѭ6of \”的返回类型。
这是之前使用ѭ12的示例,并使用广义提升进行了重写:
贡炮逗握惫
和
是不同的类型。由于haskell具有静态类型的性质,因此它无法执行任何功能。它必须具有特定类型的功能。 假设以类型
传入
。那么
的类型为
。但是
必须具有与
相同的类型。因此,类型
的函数必须是类型
的函数。因此
必须与
相同,后者是无限类型
。它不存在。 (继续用
代替
)
臀博
懊毁暗
是否确实传递了
期望的参数,因此它会拒绝程序。简而言之,检查是在运行时完成的,然后程序可能会失败。
庞协腿宛炯
在这种情况下,所讨论的\“ f \”是使用可允许递归数据类型定义的已区分联合定义的。我猜这可以用来解决提到的问题。
壤欠攻混
让我们定义一个可以接受这样的列表并将其应用于函数的函数。这里有些类型的骗术:函数的类型为
,仅当此类型与列表类型的
标记匹配时,才会编译对
的调用。通过不指定输出类型
,我们可以在其中留出一些自由(创建列表时,我们不必立即完全固定可应用的功能类型)。
而已!现在,我们可以将函数应用于存储在列表类型中的参数。期望更多? :)
不幸的是,我们被锁定在列表类型中,我们不能只转换普通列表以使用
。我怀疑这是类型检查器的根本问题(类型最终取决于列表的值),但是老实说,我不确定。
如果您对使用异构列表感到不舒服,您所要做的就是向
类型添加一个额外的参数,例如:
此处的“ 5”表示参数类型,应用的函数还必须接受所有相同类型的参数。
究补闯
list的适用实例比这个超级狭窄的用例要广泛得多...
因此,确切地说,这不是一个相同的概念,但是它包含了许多组成用例,并增加了一些其他用例。