多态递归 - 语法和用法?

时间:2016-10-25 18:39:53

标签: haskell recursion

我花了很多时间查看learnyouahaskell并且我没有找到有关多态递归的好解释!

我理解基本的递归结构:

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

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

1 个答案:

答案 0 :(得分:6)

多态递归的类型推断是不可判定的,这意味着编译器即使在类型良好的情况下也不能推断这种函数的类型。

例如,普通列表将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 -> Int

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