我正在尝试解析XML,但我想过滤和提取给定节点中确定数量的子节点.例如:
<root>
<node id="a" />
<node id="b" />
<node id="c" />
<node id="d" />
</root>
Run Code Online (Sandbox Code Playgroud)
然后,如果我执行箭头getChildren >>> myFilter 2
,我将只返回ID为"a"和"b"的节点.
直觉让我应该用状态箭来跟踪,但我不知道该怎么做.
我试着自己做,但这不是我想要的,看起来不是很优雅,也不行.我尝试运行我的箭头链runSLA
和一个整数参数作为初始状态,然后定义:
takeOnly :: IOSLA Int XmlTree XmlTree
takeOnly = changeState (\s b -> s-1)
>>> accessState (\s b -> if s >= 0 then b else Nothing)
Run Code Online (Sandbox Code Playgroud)
但当然我无法返回Nothing
,我需要返回一个XmlTree.但我根本不想回报任何东西!
可能有更好的方法.你能帮助我吗?
感谢您的时间和帮助!
说我有f :: u -> v -> w
和g :: x -> y -> z
.我想要的是h :: (u,x) -> (v,y) -> (w,z)
.
所以我可以手动解决这个问题:
h (u,x) (v,y) = (f u v, g x y)
Run Code Online (Sandbox Code Playgroud)
但那里的乐趣在哪里?
使用(***)
我可以在那里中途:
(f *** g) :: (u,x) -> (v -> w, y -> z)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何获得最后一英里.
我最近在这篇文章中遇到了关于函数式编程不同方面的有用资源,比如monad和monoids等.
但问题是 - 普通程序员可以用这些概念做些什么.我经常对这些问题进行"学术"研究.但是,我从未在实践中(在实际项目中)遇到任何人使用它们.
所以问题是 - 在Haskell中是否有任何广泛使用的开源项目真正利用这些东西,这些项目在"生产"软件中证明了这一概念的实际必要性,而不是在"学术"软件中写的"纯娱乐".制作这样的列表会很酷:
我正在关注算子,应用函子...我不知道如何到达我想要的地方,但我觉得遵循这些类型应该让我更接近.
是否有一种简单的方法可以制作map
仅适用于2元组的第一个元素的-alike?以first
从Control.Arrow
和使用Arrow (->)
,该做的伎俩很好:
map . first :: (b -> c) -> [(b, d)] -> [(c, d)]
Run Code Online (Sandbox Code Playgroud)
我唯一担心的是我还没有获得真正的箭头直觉,所以如果我坚持下去的话,我迟早会发现自己处于深水中.此外,这似乎是一个相当方便的案例,不能一概而论.
我可以通过使用仿函数,monad或其他任何东西来获得相同的功能,同时了解我想要的内容吗?我一直在玩弄
\f -> map (f `on` fst)
Run Code Online (Sandbox Code Playgroud)
类似的想法,但不能完全到达那里.
我有一个箭头输出值列表(a b [c]
)和另一个箭头接受该类型的单个值(a c d
).我需要的基本上是一种链接它们或提升第二个箭头的方法a [c] [d]
.
我正在使用Fancybox与Pikachoose的集成,如下所述:http://www.pikachoose.com/how-to-fancybox/
我正试图让灯箱显示下一个和之前的箭头,但不是在pikachoose舞台上,我遇到了一些麻烦.我试图showNavArrows: true
在脚本的fancybox部分添加选项,但它不起作用.那么我尝试使用pikachoose上的导航选项来显示使用this: {text: {previous: "Previous", next: "Next" }}
但是我一直收到错误,可能我的语法不在正确的位置?有人可以帮忙吗?
这是我正在使用的代码:
$(document).ready(function () {
var a = function (self) {
self.anchor.fancybox({
transitionIn: elastic,
transitionOut: elastic,
speedIn: 600,
speedOut: 200,
overlayShow: false
});
};
$("#pikame").PikaChoose({
showCaption: false,
buildFinished: a,
autoPlay: false,
transition: [0],
speed: 500,
showCaption: false
});
});
Run Code Online (Sandbox Code Playgroud) 我仍然试图弄清楚箭头表示法和Haskell中定义的箭头类型类的语义之间的相似之处.特别是,这个问题似乎有一个用箭头符号写的小计数器的非常规范的例子:
counter :: ArrowCircuit a => a Bool Int
counter = proc reset -> do
rec output <- returnA -< if reset then 0 else next
next <- delay 0 -< output+1
returnA -< output
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何在没有箭头符号的情况下将其转换回Haskell2010吗?
为了尝试简化这个问题,我已经定义了这些箭头函数:
splitA :: (Arrow arr) => arr a b -> arr a (b,a)
splitA ar = ar &&& (arr (\a -> id a))
recordArrow
:: (Arrow arr)
=> (d -> r)
-> (d -> r -> d)
-> (r -> r)
-> arr d d
recordArrow g s f = splitA (arr g >>^ f) >>^ \(r,d) -> s d r
Run Code Online (Sandbox Code Playgroud)
然后让我做这样的事情:
unarrow :: ((->) b c) -> (b -> c) -- unneeded as pointed out to me in the …
Run Code Online (Sandbox Code Playgroud) 我花了一段时间学习和搜索了Arrows,但对Arrow类的必要性感到有些困惑。据我所知,Arrow类是函数的抽象,而Arrow A a b c
表示某种东西需要b类型的输入和c类型的输出。此外,它提供了像一些基本的操作>>>
,arr
和first
。
但是,我找不到type的标准函数和type的b -> c
Arrow 之间的任何区别A a b c
。在我看来,first
并>>>
可以通过更换\(b, c) -> (f b, c)
,和(.)
。另外,由于箭头内的每个计算都由函数表示,因此如果我们用这些函数替换箭头,我认为不会有任何区别。
简而言之,我认为Arrows计算图的每个节点(类似于 https://www.haskell.org/arrows/syntax.html)都可以由Haskell的标准函数代替。如果属实,为什么我们使用Arrow代替函数?
import Control.Lens
import Control.Lens.TH
data Foo = Foo {
_bar, _baz :: Int
}
makeLenses ''Foo
Run Code Online (Sandbox Code Playgroud)
现在,如果我想修改两个int字段,我可以做
barbaz :: Setter' Foo Int
barbaz = sets $ \foo f -> foo & bar %~ f
& baz %~ f
Run Code Online (Sandbox Code Playgroud)
但这似乎是一种非常难看的手动方式.
使用镜头/箭头组合器可以直接实现吗?