我正在编写一个Haskell函数,它以列表作为输入.也就是说,没有理由它不能成为队列或出队,或任何允许我访问其"头部"及其"尾部"(并检查它是否为空)的东西.所以[a]输入类型似乎太具体了.但是AFAIK没有标准的库类型类可以捕获这个接口.当然,我可以将我的函数包装在Data.Foldable.toList中并使其变为多态wrt可折叠,但这看起来不太正确(惯用).
为什么没有标准的列表类型类?(为什么Haskell中的"容器"类型层次结构比我认为应该更少?)或者我错过了必要的东西?
我正在尝试找到一种好方法来记忆Haskell中部分域(非负整数)的函数,使用Data.MemoCombinators.
import Data.MemoCombinators
--approach 1
partFib n | n < 0 = undefined
| otherwise = integral fib n where
fib 0 = 1
fib 1 = 1
fib k = partFib (k-1) + partFib (k-2)
--approach 2
partFib2 n | n < 0 = undefined
| otherwise = fib n
fib = integral fib'
where
fib' 0 = 1
fib' 1 = 1
fib' n = partFib2 (n-1) + partFib2 (n-2)
Run Code Online (Sandbox Code Playgroud)
方法1是我想要的方式,但它似乎不起作用.我假设这是因为fib每次partFib调用函数都被"重新创建" ,丢掉了memoization. …