我现在正在尝试学习Scala,在Haskell中有一些经验.对我来说奇怪的一件事是Scala中的所有函数参数都必须用类型注释 - 这是Haskell不需要的东西.为什么是这样?试着把它作为一个更具体的例子:add函数写成如下:
def add(x:Double, y:Double) = x + y
Run Code Online (Sandbox Code Playgroud)
但是,这只适用于双打(嗯,因为隐式类型转换,因此也可以工作).但是,如果要定义自己的类型来定义自己的+运算符,该怎么办?你会如何编写一个适用于定义+运算符的任何类型的add函数?
$.getJSON当返回的数据不是有效的JSON时,jQuery 无声地失败似乎非常不方便.为什么这是以无声失败实现的?使用更好的失败行为执行getJSON的最简单方法是什么(例如抛出异常console.log(),或者其他什么)?
我听说Haskell的"破坏"约束系统存在一些问题,如GHC 7.6及以下版本.它出什么问题了?是否有可比的现有系统克服了这些缺陷?
例如,edwardk和tekmo都遇到了麻烦(例如来自tekmo的评论).
有一些想法的Comonad类型类是在Haskell什么,我听说过的商店comonad.但是看看Control.Comonad.Store.Lazy,我真的不明白.这是什么意思?它是为了什么?我听说过Store = CoState,State Monad的双重身份.那是什么意思?
据我了解,Scala"for"语法与Haskell的monadic"do"语法非常相似.在Scala中,"for"语法通常用于Lists和Options.我想将它与Eithers 一起使用,但默认导入中不存在必要的方法.
for {
foo <- Right(1)
bar <- Left("nope")
} yield (foo + bar)
// expected result: Left("nope")
// instead I get "error: value flatMap is not a member..."
Run Code Online (Sandbox Code Playgroud)
这个功能是通过一些导入提供的吗?
有一个轻微的障碍:
for {
foo <- Right(1)
if foo > 3
} yield foo
// expected result: Left(???)
Run Code Online (Sandbox Code Playgroud)
对于列表,它将是List().因为Option,它会None.Scala标准库是否为此提供了解决方案?(或许scalaz?)怎么样?假设我想为Either提供我自己的"monad实例",我怎么能这样做?
这将是一个相当不错的ghc-pkg check列出破损的包,以及为什么它们被打破.但据我所知,没有自动化的方法来处理那些破损的包裹.处理破损包裹的推荐方法是什么?(最好不要重新安装GHC)
我一直在寻找Data.MemoCombinators的来源,但我无法真正看到它的核心位置.
请向我解释所有这些组合器背后的逻辑以及它们如何在实际编程中加速您的程序实际工作的机制.
我正在寻找这个实现的细节,并可选择与其他Haskell方法进行比较/对比来进行memoization.我理解什么是memoization,而不是在寻找它的工作原理.
为什么Scala有unapply和unapplySeq?两者有什么区别?我什么时候应该更喜欢一个?
我知道OverloadedStrings语言编译指示包含fromString所有字符串文字的隐含.我想要做的不是实际上重载字符串,而只是改变它们的含义以便它们总是被转换为Text,因此,使用字符串文字作为字符列表应该导致类型错误.
如果不导入IsString该类的String实例,则导入该类似乎是不可能的.ghc是否为我提供了一些限制字符串文字的方法Text?
玩一些代码:
{-# LANGUAGE FlexibleInstances, OverlappingInstances #-}
class Arity f where
arity :: f -> Int
instance Arity x where
arity _ = 0
instance Arity f => Arity ((->) a f) where
arity f = 1 + arity (f undefined)
Run Code Online (Sandbox Code Playgroud)
没有IncoherentInstances:
ghci> arity foldr
blah blah ambiguous blah blah possible fix blah
ghci> arity (foldr :: (a -> Int -> Int) -> Int -> [a] -> Int)
3
ghci> let f x y = 3 in …Run Code Online (Sandbox Code Playgroud) haskell ×7
ghc ×3
scala ×3
typeclass ×3
combinators ×1
comonad ×1
dependencies ×1
either ×1
jquery ×1
json ×1
memoization ×1
monads ×1
polymorphism ×1
silent ×1
unapply ×1