我想将两个Java-8-Streams一起迭代,以便我在每次迭代中都有两个参数.像这样的东西,somefunction
产生类似的东西Stream<Pair<A,B>>
.
Stream<A> as;
Stream<B> bs;
somefunction (as, bs)
.forEach ((a, b) -> foo (a, b));
// or something like
somefunction (as, bs)
.forEach ((Pair<A, B> abs) -> foo (abs.left (), abs.right ()));
Run Code Online (Sandbox Code Playgroud)
我想知道,如果Java提供类似的东西,虽然Pair
在Java中没有:-(如果没有像这样的API函数,是否有另一种方式同时迭代两个流?
以下python教程说:
列表理解是lambda函数以及功能完整的替代品
map()
,filter()
和reduce()
.
但是,它没有提到列表理解如何替代a reduce()
的示例,我无法想象它应该如何成为可能.
可以请某人解释如何通过列表理解实现类似减少的功能或确认它不可能吗?
阅读http://learnyouahaskell.com/后我仍然不明白,Haskell中是如何构建复杂的数据结构的.
一个例子:
我有很多地方,每个地点都能够容纳一个项目.每个项目都可以定位在一个位置.位置和项目都有一个名称和一些额外的信息(我把它们留在这里).每个位置和每个项目的名称都是唯一的.
此问题出现在优化问题的上下文中,应该构建一个短传输列表.这意味着,对象只需读取一次,然后就不会被操纵.存在更多类型,它们都通过面向对象设计中的实例字段链接在一起.
我的第一个想法(根据我对面向对象设计的了解)将是:
data Location = Location String Item
data Item = Item String Location
Run Code Online (Sandbox Code Playgroud)
由于没有引用,只有Haskell中的值,我希望这是一个无休止的递归.
data Location = Location String Item
data Item = Item String
Run Code Online (Sandbox Code Playgroud)
通过这种方法,当我只有物品时,我无法获得位置.
我的第二个想法是:
data Location = Location String
data Item = Item String
type LocItems = [(Location, Item)]
Run Code Online (Sandbox Code Playgroud)
好吧,这种方式我必须给出方法,它需要一个位置的项目,两个参数:位置和地图.当它变得越来越复杂时,我最终会得到许多地图.反对这种方法的第二个原因:类型系统不限制仅链接到另一个的位置和项目.地图(或更好的关联列表)可以将一个位置映射到多个项目.
我不明白如何在Haskell中构建这样复杂的结构.
那么如何在Haskell中构建这样的数据结构呢?
我想知道Java 8中是否有可能获得标准运算符的方法引用(+, - ,<,>,...).
我希望得到它,就像Foo::+
Foo是我可以得到它的一些定义的地方.由于Java不允许方法名称中的特殊字符,我认为不可能,是吗?
如果上面的方法不存在:是否有一些标准运算符被定义的地方Foo::plus
?
我知道将它定义为lambda((x, y) -> x + y
)是可能的,但在我看来,在某些情况下,它可能更具表现力,在Haskell中可以使用对运算符的方法引用.
在我看来,这似乎是一个简单的问题,但我仍然试图找到一个好的解决方案.我正在使用Slick 3.0.我想查询表中的一行,该表在一列中具有最高值.但我不想只有最高价值(这很简单),我想拥有整行.我试了一些东西,比如先查询最大值,然后用这个最大值过滤,但没有编译或看起来合适.我希望有一个像这样的方法:
table.maxBy(_.columnName)
Run Code Online (Sandbox Code Playgroud)
但我没有找到这样的方法.那么做这样的事情最喜欢的方式是什么?
我有一个元组与同一类型的两个部分和一个Int之间的映射.
Map (a,a) Int
Run Code Online (Sandbox Code Playgroud)
独立as
于元组中的顺序,我希望以后能够将它从地图中取出.
lookup (2,1) map == lookup (1,2) map
Run Code Online (Sandbox Code Playgroud)
没有插入元组两次这可能吗?
我想写一些功能工厂.它应该是一个函数,它被称为一次不同的策略作为参数.它应该返回一个函数,该函数根据参数选择其中一个策略,该参数由谓词实现.那么,更好condition3
地了解更好的理解.问题是,它没有编译.我认为因为编译器无法弄清楚,功能接口H
可以通过实现来实现.没有泛型它工作正常.
@FunctionalInterface
public interface Finder<T, S> {
Stream<S> findBest (T t);
// Valid code
static <P, Q> Finder<P, Q> condition1 () {
return p -> null;
}
// Valid code, but selects just one of the H's when the method is invoked
static <P, Q, H extends Finder<P, Q>> H condition2 (Pair<Predicate<P>, H>... hs) {
return hs[0].getRight ();
}
// Should return a method, which selects the appropiate H
// whenever it is invoked with an …
Run Code Online (Sandbox Code Playgroud) 我想将函数的类型参数限制为功能接口.
像这样的东西:
public static <@FunctionalInterface T extends Function<A, B>> T foo () {
return a -> bar;
}
Run Code Online (Sandbox Code Playgroud)
在@FunctionalInterface
这里不允许使用.
目的是使得可以返回具有类型参数类型的lambda.由于T
可以是普通类,因此不允许返回lambda.
是否有可能将类型参数限制为功能接口?
我是一个haskell新手,不知道如何以一种富有表现力的方式结合以下功能:
f :: A -> B
g :: B -> Maybe C
h :: C -> Bool
Run Code Online (Sandbox Code Playgroud)
我想要一个这样的函数:
y :: A -> Bool
Run Code Online (Sandbox Code Playgroud)
目前我这样做:
y a = case (fmap h ((g.f) a)) of {
Just b -> b;
Nothing -> False}
Run Code Online (Sandbox Code Playgroud)
嗯,我认为,这真的很难看(好吧,这里只有字母作为名字,但真正的代码也是丑陋的).我想要的是功能的连接,更具表现力,如:
y a = (h.g.f) a `or` False
Run Code Online (Sandbox Code Playgroud)
如何将monadic函数与仿函数结合起来,是否有类似的东西or
(比如Optional#orElse
Java 8?)
我在IO上下文中有几种数据类型,如:
a :: IO String
b :: IO FilePath
c :: String -> IO String
Run Code Online (Sandbox Code Playgroud)
我想把它们放在一个数据对象中,如:
data Configdata = Configdata String FilePath (String -> String)
Run Code Online (Sandbox Code Playgroud)
因此,我不必从IO上下文中获取自己的每个值,而只是从中获取IO Configdata
.
我没有解决方案的关键点是我如何转变String -> IO String
为IO (String -> String)
.Hoogle没有给我任何能够做到这一点的功能.
我不确定它是否可能甚至不可能,因为函数的输入可能是无限的.
有人有解决方案或解释为什么不可能?我知道使用列表而不是函数是一个选项,但我更愿意使用函数.