作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在元素列表上实现通用滑动窗口算法。一个常见的用例是在所有长度为 5 的窗口中找到最大的数字。或者它可以计算窗口中有多少元素对于某个谓词是正确的。
滑动窗口从左到右,并保持一些数据结构。一个元素落在它调用的窗口之外 remove
关于数据结构。如果一个新元素落在窗口内,我们 add
数据结构的元素。它还有一个功能aggregate
,它在数据结构上计算一些东西。
要使用的简单数据结构是出队,但可能有人希望将其他类型的数据结构用于特殊用例。
我最初的想法是有一个看起来像这样的长函数
runSlidingWindow :: (c->(Int,a)->c) -- add
-> (c->(Int,a)->c) -- remove
-> (c->b) -- aggregate
-> c -- identity
-> Int -- width
-> [(Int,a)] -- input
-> [(Int,b)]
Window a b c
, 这样我们就可以将函数重写为
runSlidingWindow :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> [(Int,a)]
-> [(Int,b)]
runSlidingWindow window input
Window a b c
的实例具有形式的功能
add :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> a
-> WindowInstance a b c
remove :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> a
-> WindowInstance a b c
aggregate :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> b
Window a b c
很重要,因为这允许其他人实现自己的滑动窗口。
最佳答案
每当您认为“我需要一个类型类”时,请停下来考虑一下函数记录是否可行。
data Window a b c = Window {
add :: c -> (Int, a) -> c,
remove :: c -> (Int, a) -> c,
aggregate :: c -> b,
identity :: c,
width :: Int}
runSlidingWindow :: Window a b c -> [(Int, a)] -> [(Int, b)]
{-# LANGUAGE ExistentialQuantification #-}
data Window a b = forall c. Window {
add :: c -> (Int, a) -> c,
remove :: c -> (Int, a) -> c,
aggregate :: c -> b,
identity :: c,
width :: Int}
runSlidingWindow :: Window a b -> [(Int, a)] -> [(Int, b)]
关于haskell - 在Haskell中设计一个通用的滑动窗口程序,需要type类族吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15740970/
在C中,protocol family被提及为第一个参数。 例如: ipv4 的套接字(AF_INET,,) socket(AF_PACKET,,) 用于数据包嗅探 Python 支持三个地址族:AF
根据 vfork() 手册页,如果 vfork() 在调用 _exit 或 exec 之前修改除 pid_t 之外的任何数据,则行为未定义系统调用系列。 由此我了解到,如果vfork()创建的子进程调
我是一名优秀的程序员,十分优秀!