我花了很多时间查看 learnyouahaskell,但没有找到多态递归的良好解释!
我了解基本的递归结构:
myFunction :: [Int] -> [Int]
myFunction [] = []
myFunction (x : xs) = (\x -> x + 1) x : myFunction xs
多态递归会是什么样子?它的好处/用途是什么?
多态递归的类型推断是不可判定的,这意味着编译器不能infer此类函数的类型,即使它是类型良好的。
例如,普通列表适用List
两侧相同(多态)类型:
data List a = Cons a (List a)
而这种类型取自维基百科文章 https://en.wikipedia.org/wiki/Polymorphic_recursion适用Nested
两种不同的(多态性)类型,a
and [a]
:
data Nested a = a :<: (Nested [a]) | Epsilon
从同一篇文章中,编译器将无法推断出相对简单的类型length
功能
length Epsilon = 0
length (a :<: xs) = 1 + length xs
because length
应用于第二个方程中两种不同类型的值,Nested a
and Nested [a]
.
解决方案是断言该类型确实是Nested a -> Int
.
length :: Nested a -> Int
length Epsilon = 0
length (a :<: xs) = 1 + length xs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)