【问题标题】:Polymorphic recursion - syntax and uses?多态递归 - 语法和用途?
【发布时间】:2016-10-26 03:04:13
【问题描述】:

我花了很多时间研究 learnyouahaskell,但我还没有找到关于多态递归的一个很好的解释!

我了解基本的递归结构:

myFunction :: [Int] -> [Int]
myFunction [] = []
myFunction (x : xs) = (\x -> x + 1) x : myFunction xs

多态递归会是什么样子?它有什么好处/用途?

【问题讨论】:

标签: haskell recursion


【解决方案1】:

多态递归的类型推断是不可判定的,这意味着编译器无法推断这样的函数的类型,即使它是正确类型的。

例如,一个普通的列表将List应用于两边的相同(多态)类型:

data List a = Cons a (List a)

虽然这种取自 Wikipedia article 的类型将 Nested 应用于两种不同的(多态)类型,a[a]

data Nested a = a :<: (Nested [a]) | Epsilon

从同一篇文章中,编译器将无法推断出相对简单的length 函数的类型

length Epsilon = 0
length (a :<: xs) = 1 + length xs

因为length 应用于第二个等式中两种不同类型的值Nested aNested [a]

解决办法是断言类型确实是Nested a -&gt; Int

length :: Nested a -> Int
length Epsilon = 0
length (a :<: xs) = 1 + length xs

【讨论】:

  • 谢谢!您能用更简单的术语解释一下“嵌套”示例吗?我查看了 Wiki 文章,仍然有点迷茫,例如 ':<:>
  • 它只是一个中缀数据构造函数(类似于中缀运算符,但必须以:开头)。您可以编写与data Nested a = NestedCons a (Nested [a]) | Epsilon 相同的定义,将中缀构造函数:&lt;: 替换为名为@9​​87654338@ 的“常规”数据构造函数。
  • 你能举个简单的例子来说明它们的使用吗? :P
  • @BabraCunningham 它就像(:) 一样用于列表。例如,['b', 'c']'b' : 'c' : [] 的语法糖,[Char] 使用构造函数 (:)[] 构建。类似地,'a' :&lt;: ['b', 'c'] :&lt;: Epsilon 是使用构造函数 (:&lt;:)Epsilon 构建的 Nested Char
  • @Peter 解决方案是显式类型注释。与:(x:xs)xs 具有相同的类型。 (x :&lt;: xs)xs 则不然; (x :&lt;: xs) 的类型为 Nested a,而 xs 的类型为 Nested [a]
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多