我得到的问题说:
以类似于mapMaybe的方式,定义函数:composeMaybe ::(a-> Maybe b) - >(b - > Maybe c) - >(a-> Maybe c),它组成两个错误提升函数.
类型Maybe a和函数mapMaybe的编码如下:
data Maybe a = Nothing | Just a
mapMaybe g Nothing = Nothing
mapMaybe g (Just x) = Just (g x)
Run Code Online (Sandbox Code Playgroud)
我尝试使用这样的组合:
composeMaybe f g = f.g
Run Code Online (Sandbox Code Playgroud)
但它没有编译.
有人能指出我正确的方向吗?
在传统的MDI应用程序中,当命令发生时(例如按下功能区按钮)将创建一些对象(表单),因此它可能是一个组合点.我对这些应用程序中的组合根感到困惑.我在某处读到我们可以使用看起来像Service Locator模式的ViewModelLocator.如您所知,服务定位器模式遭到某些人的谴责.
现在请告诉我这个问题.
提前致谢.
wpf mdi dependency-injection inversion-of-control composition
我正在尝试通过使用看起来像组合模式的东西来构建一个可以具有任意数量的子进程条的进度条类.
假设我有这个课程pbar:
class pbar
{
public:
pbar(const int w) { width = w; } // already sets the
~pbar() {}
void setwidth(const int w) { width = w; } // set the width to w
void show() const;
void sync();
void add(const pbar bar)
{
// add's a subbar
subbars.pushback(bar);
}
private:
std::vector<pbar> subbars; // the sub-process progressbars
int width; // onscreen width of the pbar
};
Run Code Online (Sandbox Code Playgroud)
如您所见,它pbar有两个成员:宽度和子进程条(它们本身pbars).我一直在尝试实现一个sync函数,它改变了pbarsin的所有宽度,subbars以匹配 …
"赞成合成而不是继承"这个短语是否适用于Swing组件?在开始设计UI之前,我想收集一些关于这个主题的专业意见以及哪些代码更易于维护.
STL中可能有以下内容:
int count = count_if(v.begin(), v.end(), bind2nd(less<int>(), 3));
Run Code Online (Sandbox Code Playgroud)
这将返回v中小于3的元素数.如何组成一个返回0到3之间元素数的仿函数?我知道boost有一些设施,但纯STL有可能吗?
在我的第一个问题
帮助阐明了依赖注入.史蒂文的详尽答案(简言之,如果可能的话)可重用库是一个特殊情况,我们可以在这里使用poor-man-injection(请参阅答案的完整性).
研究AutoFixture的源代码,您可以注意到主要组件在任何地方使用DI而不依赖于容器; 马克·西曼(Mark Seemann)着
问题是:有人可以引入模式(或良好实践)来抽象组合根而不使用容器吗?
附加说明(可选):
返回到AutoFixture,其中组合根出现在Fixture类型构造函数中; 我认为*Relays该类用于以类似的方式对实例进行分组,一些DI库具有模块的概念.有趣的是,有一种名称BehaviourRoot位于图形顶部的类型(这是我正在搜索的抽象类型吗?).
给定值f类型:: Applicative f => f (a -> b -> c),将参数映射到内部函数的最佳方法是什么.
到目前为止,我发现了以下内容:
(\x -> x a b) <$> f
(flip ($ a) b) <$> f
($ b) <$> ($ a) <$> f
我想我的问题是为什么Haskell没有:: a -> b -> (a -> b -> c) -> c功能.或者是吗?
haskell functional-programming composition functor applicative
考虑以下情况.我定义了一个函数来处理元素列表,通过在头上执行操作的典型方法并在列表的其余部分上调用函数.但在元素的某些条件下(为负面,是一个特殊字符,......)我会在继续之前更改列表其余部分的符号.像这样:
f [] = []
f (x : xs)
| x >= 0 = g x : f xs
| otherwise = h x : f (opposite xs)
opposite [] = []
opposite (y : ys) = negate y : opposite ys
Run Code Online (Sandbox Code Playgroud)
因为opposite (opposite xs) = xs,我变成了多余的相反操作的情况,积累opposite . opposite . opposite ....
它发生在其他操作而不是opposite任何这样的组合物本身就是身份,就像reverse.
是否有可能使用仿函数/ monads/applicatives /箭头克服这种情况?(我不太了解这些概念).我想要的是能够定义属性或组合模式,如下所示:
opposite . opposite = id -- or, opposite (opposite y) = y
Run Code Online (Sandbox Code Playgroud)
为了使编译器或解释器避免计算相反的相反(在一些连接语言中它是可能的和简单的(本机的)).
我正在处理一个库(ghcjs-dom),其中每个函数返回一个IO (Maybe T).
我有一个函数a返回an IO (Maybe x)和函数b,它x作为参数并返回一个IO (Maybe y).
是一个允许我做a ??? b和获得的运营商IO (Maybe y).我的Hoogle搜索没有任何结果.
我正在寻找类似的东西join,IO (Maybe (IO (Maybe t)))而不是IO (IO t)或Maybe (Maybe t).
所以我不太确定如何正确地说这个,但是我想要得到列表中所有奇数的总和,我有两个函数(sumList和getOddNumbers)并将它们组合成sumOddList或者有没有办法把这两个放在一个单一的功能?如果没有更好的功能,我究竟如何将它们组合成sumOddList?
getOddNumbers :: [Integer] -> [Integer]
getOddNumbers [] = []
getOddNumbers (x:xs)
|odd x = x:getOddNumbers xs
|otherwise = getOddNumbers xs
sumList :: [Integer] -> Integer
sumList list = case list of
[] -> 0
(x:xs) -> x + (sumList xs)
Run Code Online (Sandbox Code Playgroud)
我还要问主要是因为将两个差异函数放在一起是我之前努力解决的问题,当使用CodeWorld输出颜色和形状来输出该颜色的形状时.
谢谢
(注意:我现在已经使用Haskell超过5周了,而且我显然是一个总菜刀)