我正在努力研究在我正在处理的库中报告错误的一组函数中的错误的最佳方法.
具体来说,我的功能看起来像:
foo, bar, baz :: a -> Maybe a
Run Code Online (Sandbox Code Playgroud)
这里foo只能用一种方法(很适合可能会失败Maybe),但bar并baz可以以两种不同的方式失败每个(良好拟合的Either BarErrors和Either BazErrors).
一个解决方案是创建:
data AllTheErrors = TheFooError
| BarOutOfBeer
| BarBurnedDown
| ...
Run Code Online (Sandbox Code Playgroud)
并且使所有的功能恢复Either AllTheErrors,这表示可能通过提高误差范围组成的序列,这些功能在表达误差范围可能每个牺牲个别功能.
有没有办法可以同时获得两者?也许还有除了monadic组合之外的东西?或者与家庭类型(波浪手)...?
来自http://research.microsoft.com/en-us/um/people/emeijer/Papers/meijer94more.pdf的第3页:
一般情况下,catamorphisms在组成下是封闭的
在什么条件下,catamorphisms构成了一个catamorphism?更具体地说(假设我正确地理解了陈述):
假设我有两个基础仿函数F和G每个折叠:foldF :: (F a -> a) -> (?F -> a)和foldG :: (G a -> a) -> (?G -> a).
现在假设我有两个代数a :: F ?G -> ?G和b :: G X -> X.
该构图何时成为(foldG b) . (foldF a) :: ?F -> X一个变形?
编辑:我有一个猜测,基于dblhelix的扩展答案:这outG . a :: F ?G -> G ?G必须是?G一些自然转换的组成部分? :: F a -> G a.我不知道这是否正确.( …
haskell functional-programming composition fold catamorphism
这可能是一个简单/基本的OOP问题,但我仍然无法弄清楚如何解决它.我在访谈中遇到了以下问题:制作一个UML类图并编写一个"智能"手机的基本代码,其中包含电话和MP3播放器的功能.我们有以下(接受)解决方案:
class Telephone
{
public string name { get; set; }
public Telephone()
{
name = "name telephone";
}
}
class MP3
{
public string name { get; set; }
public MP3()
{
name = "name mp3";
}
}
Run Code Online (Sandbox Code Playgroud)
而"智能"手机类:
class TelephoneMP3
{
public Telephone tel;
public MP3 mp3;
public TelephoneMP3()
{
tel = new Telephone();
mp3 = new MP3();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们在TelephoneMP3和Telephone/MP3类之间有一个组合关系.
但是,使用此代码,TelephoneMP3不是电话,而且TelephoneMP3也不是MP3,这是不合逻辑的.那么,为了使这个有效,我应该做些什么改变?例如,这种测试:
if (telMp3 is Telephone)
{
Console.WriteLine("TelephoneMP3 is telephone");
}
if (telMp3 is MP3)
{
Console.WriteLine("TelephoneMP3 is …Run Code Online (Sandbox Code Playgroud) 我有一个<ui:composition>包含一些带有显式id的元素和一些引用这些id进行部分处理/更新的ajax事件.我将xhtml的这个片段封装在组合中,这样我就可以在几个不同的地方使用它,而不必复制代码.但是,当我<ui:include>在页面中多次使用合成(with )时,我会得到重复的id异常.似乎JSF没有将每个组合包装在它自己的命名容器中(就像<ui:component>那样).
有没有一种简单的方法将我的作品包装在自己的命名容器中?或者,每次我想在公共命名容器中重用xhtml片段时,是否必须使用复合组件?
我想简短一点.我建有两间HouseA,说BedRoom和StudyRoom,从所谓的基类派生两者Room.
BedRoom并且StudyRoom有一个同一个父母叫House.此外,房屋内的任何房间只能通过父母进入任何其他房间.如果BedRoom必须访问任何属性StudyRoom,它必须只通过House(即父),反之亦然.
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Run Code Online (Sandbox Code Playgroud)
现在的问题:让我们说,我建造另一个家(比方说HouseB),这与上面完全相同,但只有一个改变.我不想要两个单独的房间(即BedRoom和StudyRoom),而是一个房间(MasterRoom),这两个房间都有这些设施.为了代码可重用性,我可以想到以下设计选项:
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Run Code Online (Sandbox Code Playgroud)
在这里,我失去了再利用的属性的能力BedRoom和StudyRoom我的创造HouseA.请注意,大多数的属性BedRoom,并StudyRoom需要重新实现MasterRoom无论如何,从而导致代码重复.
Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS …Run Code Online (Sandbox Code Playgroud) 让我说我有class,它使用了一些功能dict.我过去常常在dict里面组合一个对象并从外部提供一些访问,但最近想过简单地继承dict并添加一些我可能需要的属性和方法.这是一个好的方式,还是我应该坚持作曲?
很多次,我遇到过X形式/不构成的形式的陈述.
我记得我最近读过的几个例子:
我想了解可编组性在设计/读/写代码方面的含义?例子很好.
programming-languages functional-programming clojure composition
最近我在一本Javascript书中读到了函数组合,然后在一个网站上我看到有人将它称为currying.
它们是相同的概念吗?
我正试图在打"类型俄罗斯方块"方面做得更好.我有这些功能:
(=<<) :: Monad m => (a -> m b) -> m a -> m b
zip :: [a] -> [b] -> [(a, b)]
Run Code Online (Sandbox Code Playgroud)
而GHCi告诉我:
(zip =<<) :: ([b] -> [a]) -> [b] -> [(a, b)]
Run Code Online (Sandbox Code Playgroud)
我很难搞清楚如何从前两个签到最终签名.我的直觉(由于缺乏一个更好的词)是说的第一个参数=<<,即a -> mb以某种方式对和解的签名zip,然后将其都应该从脱落.但我无法理解如何实现这一飞跃.它可以分解为一系列易于遵循的步骤吗?
假设我有一个mean如此定义的函数:
mean xs = sum xs / (fromIntegral $ length xs)
Run Code Online (Sandbox Code Playgroud)
但我想以某种默契形式,像这样:
mean = sum / (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
是否有内置的Haskell方法可以在这些行中执行某些操作而无需构建自己的tacit函数(类似这样):
tacit :: (a -> b -> c) -> (d -> a) -> (d -> b) -> d -> c
tacit a b c i = a (b i) (c i)
Run Code Online (Sandbox Code Playgroud)
在这种形式中,函数如下所示:
mean = tacit (/) sum (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
但感觉可能有一种方法可以避免使用像这样的显式函数.我是在想; 是否有一些方法可以做到内置于Haskell?
composition ×10
haskell ×4
inheritance ×2
oop ×2
c# ×1
catamorphism ×1
clojure ×1
currying ×1
dictionary ×1
facelets ×1
fold ×1
function ×1
javascript ×1
jsf ×1
jsf-2 ×1
perl ×1
pointfree ×1
python ×1
types ×1