我有两次最近重构的代码,以便更改参数的顺序,因为有太多的代码,黑客喜欢flip
或\x -> foo bar x 42
正在发生.
在设计功能签名时,哪些原则可以帮助我充分利用currying?
我正在通过48小时为自己编写一个方案(我大约85小时)而且我已经完成了关于添加变量和赋值的部分.本章中有一个很大的概念性跳跃,我希望它分两步完成,两者之间有很好的重构,而不是直接跳到最终的解决方案.无论如何…
我已经得到了一些不同类的,似乎达到相同的目的失去了:State
,ST
,IORef
,和MVar
.文本中提到了前三个,而最后三个似乎是许多关于前三个问题的StackOverflow问题的最佳答案.它们似乎在连续调用之间都处于状态.
这些是什么以及它们如何彼此不同?
特别是这些句子没有意义:
相反,我们使用一个名为状态线程的功能,让Haskell为我们管理聚合状态.这使我们可以像在任何其他编程语言中一样处理可变变量,使用函数来获取或设置变量.
和
IORef模块允许您在IO monad中使用有状态变量.
所有这一切都使这条线路type ENV = IORef [(String, IORef LispVal)]
混乱 - 为什么第二个IORef
呢?如果我写的话会破坏什么type ENV = State [(String, LispVal)]
?
鉴于:
data Foo =
FooString String
…
class Fooable a where --(is this a good way to name this?)
toFoo :: a -> Foo
Run Code Online (Sandbox Code Playgroud)
我想做String
一个实例Fooable
:
instance Fooable String where
toFoo = FooString
Run Code Online (Sandbox Code Playgroud)
然后GHC抱怨:
Illegal instance declaration for `Fooable String'
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use -XTypeSynonymInstances if you want to disable this.)
In the instance declaration for `Fooable String'
Run Code Online (Sandbox Code Playgroud)
如果相反我使用[Char]
: …
我不明白LLVM和java(字节码)之间的区别,它们是什么?
-edit-由'他们是什么'我的意思是LLVM和java(字节码)之间的差异,而不是LLVM和java.
我已经有过几次GHC告诉我使用扩展的经验,但却发现当使用该扩展时,我使代码变得更加复杂,当一个简单的重构允许我坚持使用Haskell 98(现在2010)并有一个更直接的解决方案.
另一方面,有时候GADT或Rank2Types(很少是RankNTypes)的工作量少得多,代码也更清晰.
哪些扩展通常会掩盖更好设计的可能性,并且通常会改善它?如果有一些同时执行这两项工作,那么在决定使用该扩展之前,用户应该寻找什么(确定它们是否符合他们想要的解决方案)?
(另请参阅我是否应该使用GHC Haskell扩展?)
当我使用Merb的内置控制台时,我得到类似于标准bash提示的选项卡自动完成.我觉得这很有用,并希望在非merb IRB会话中启用它.如何在IRB中自动完成?
我刚写了以下两个函数:
fand :: (a -> Bool) -> (a -> Bool) -> a -> Bool
fand f1 f2 x = (f1 x) && (f2 x)
f_or :: (a -> Bool) -> (a -> Bool) -> a -> Bool
f_or f1 f2 x = (f1 x) || (f2 x)
Run Code Online (Sandbox Code Playgroud)
它们可能用于组合两个布尔函数的值,例如:
import Text.ParserCombinators.Parsec
import Data.Char
nameChar = satisfy (isLetter `f_or` isDigit)
Run Code Online (Sandbox Code Playgroud)
看了这两个函数后,我意识到它们非常有用.以至于我现在怀疑它们是否包含在标准库中,或者更可能是使用现有函数有一种干净的方法来执行此操作.
这样做的"正确"方法是什么?
在ruby中捕获错误,使用该rescue
语句.通常这种说法发生在begin
和之间end
.也可以使用rescue
语句作为block(do ... end
)或方法(def ... end
)的一部分.我的问题是什么其他结构(循环,而如果,......),如果有任何将拯救巢内?
来自OOP语言,我熟悉面向对象设计的SOLID原则.似乎其中一些适合功能性编程模型,而其他部分在缺乏状态的世界中毫无意义.重构功能代码是否有类似的原则?
我在mtl库中查找了一些东西时遇到了RWS Monad及其MonadTransformer.那里没有真正的文档,我想知道这是什么以及它在哪里使用.
我发现RWS是Reader,Writer,State的首字母缩略词,这就是这三个monad变换器的堆栈.我无法弄清楚为什么这比国家本身更好.
haskell ×6
ruby ×2
combinators ×1
comparison ×1
currying ×1
ghc ×1
ioref ×1
irb ×1
java ×1
jvm ×1
llvm ×1
monads ×1
pointfree ×1
state-monad ×1
syntax ×1
type-systems ×1
typeclass ×1
variables ×1