读者monad是如此复杂,似乎没用.在像Java或C++这样的命令式语言中,如果我没有弄错的话,读者monad没有相同的概念.
你能给我一个简单的例子并清楚一点吗?
考虑一种情况,我有三种(或更多)方法执行计算,每种方法都可能因异常而失败.为了尝试每次计算,直到我们找到一个成功,我一直在做以下事情:
double val;
try { val = calc1(); }
catch (Calc1Exception e1)
{
try { val = calc2(); }
catch (Calc2Exception e2)
{
try { val = calc3(); }
catch (Calc3Exception e3)
{
throw new NoCalcsWorkedException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何可接受的模式以更好的方式实现这一目标?当然,我可以将每个计算包装在一个辅助方法中,该方法在失败时返回null,然后只使用??
运算符,但是有一种方法可以更普遍地执行此操作(即,无需为我想要使用的每个方法编写辅助方法)?我已经考虑过使用泛型编写一个静态方法,它在try/catch中包装任何给定的方法,并在失败时返回null,但我不确定如何解决这个问题.有任何想法吗?
有许多功能习语:monad,applicatives,arrows等.它们记录在不同的文章中,但不幸的是我不知道任何书籍或文章在一个地方汇总(有Typeclassopedia但它有很多没有很好覆盖的区域).任何人都可以推荐一篇文章/书籍,它可以在一个地方很好地覆盖它们,并且具有FP中级技能的程序员可以访问它吗?
申请人撰写,monad没有.
上述陈述是什么意思?什么时候比其他人更好?
monads haskell functional-programming monad-transformers applicative
map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)
为什么我们有三个不同的功能,基本上是一样的?
我正在通过48小时为自己编写一个方案(我大约85小时)而且我已经完成了关于添加变量和赋值的部分.本章中有一个很大的概念性跳跃,我希望它分两步完成,两者之间有很好的重构,而不是直接跳到最终的解决方案.无论如何…
我已经得到了一些不同类的,似乎达到相同的目的失去了:State
,ST
,IORef
,和MVar
.文本中提到了前三个,而最后三个似乎是许多关于前三个问题的StackOverflow问题的最佳答案.它们似乎在连续调用之间都处于状态.
这些是什么以及它们如何彼此不同?
特别是这些句子没有意义:
相反,我们使用一个名为状态线程的功能,让Haskell为我们管理聚合状态.这使我们可以像在任何其他编程语言中一样处理可变变量,使用函数来获取或设置变量.
和
IORef模块允许您在IO monad中使用有状态变量.
所有这一切都使这条线路type ENV = IORef [(String, IORef LispVal)]
混乱 - 为什么第二个IORef
呢?如果我写的话会破坏什么type ENV = State [(String, LispVal)]
?
我是函数式编程的新手,最近在Learn You a Haskell学习,但是当我完成本章时,我遇到了以下程序:
import Control.Monad.Writer
logNumber :: Int -> Writer [String] Int
logNumber x = Writer (x, ["Got number: " ++ show x])
multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
b <- logNumber 5
return (a*b)
Run Code Online (Sandbox Code Playgroud)
我将这些行保存在.hs文件中,但无法将其导入我的ghci,抱怨:
more1.hs:4:15:
Not in scope: data constructor `Writer'
Perhaps you meant `WriterT' (imported from Control.Monad.Writer)
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
我通过":info"命令检查了类型:
Prelude Control.Monad.Writer> :info Writer
type Writer w = WriterT w Data.Functor.Identity.Identity
-- Defined in …
Run Code Online (Sandbox Code Playgroud) Hackage有几个monad变换器包:
(也许我错过了一些)
我们应该使用哪一个?
mtl是Haskell平台中的一个,但我一直听说reddit它是不酷的.
但无论如何,选择有什么不好,这不是一件好事吗?
好吧,我看到数据访问器的作者如何必须使所有这些满足流行的选择:
我想如果这种情况继续下去,例如几个竞争的箭头包演变,我们可能会看到类似:spoonklink-arrows-transformers,spoonklink-arrows-monadLib,spoonklink-tfArrows-transformers,spoonklink-tfArrows-monadLib,...
然后我担心如果spoonklink被分叉,Hackage将耗尽磁盘空间.:)
问题:
我无法理解Option[T]
Scala中的课程要点.我的意思是,我不能看到任何advanages None
了null
.
例如,考虑代码:
object Main{
class Person(name: String, var age: int){
def display = println(name+" "+age)
}
def getPerson1: Person = {
// returns a Person instance or null
}
def getPerson2: Option[Person] = {
// returns either Some[Person] or None
}
def main(argv: Array[String]): Unit = {
val p = getPerson1
if (p!=null) p.display
getPerson2 match{
case Some(person) => person.display
case None => /* Do nothing */
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设,该方法getPerson1
返回null …
monads ×10
haskell ×8
scala ×2
applicative ×1
c# ×1
functor ×1
ioref ×1
java ×1
list ×1
null ×1
reader-monad ×1
redundancy ×1
state-monad ×1
try-catch ×1
variables ×1