是否有一些替代品map并行评估列表?我不需要它懒惰.
类似的东西:pmap :: (a -> b) -> [a] -> [b]让我pmap expensive_function big_list拥有100%的核心.
我正在经历一个试图避免临时变量和过度使用条件的阶段,我可以使用更流畅的编码风格.我非常喜欢#tap在我想要获得我需要返回的值的地方使用,但在我返回它之前先做一些事情.
def fluid_method
something_complicated(a, b, c).tap do |obj|
obj.update(:x => y)
end
end
Run Code Online (Sandbox Code Playgroud)
比.程序:
def non_fluid_method
obj = something_complicated(a, b, c)
obj.update(:x => y)
obj # <= I don't like this, if it's avoidable
end
Run Code Online (Sandbox Code Playgroud)
显然上面的例子很简单,但这仍然是ruby社区中非常常见的编码风格.我有时会使用#inject一系列过滤器传递一个对象:
things.inject(whatever) do |obj, thing|
thing.filter(obj)
end
Run Code Online (Sandbox Code Playgroud)
比.程序:
obj = whatever
things.each do |thing|
obj = thing.filter(obj)
end
obj
Run Code Online (Sandbox Code Playgroud)
现在我正面临着如下条件的重复使用,并寻找一种更流畅的方法来处理它:
def not_nice_method
obj = something_complex(a, b, c)
if a_predicate_check?
obj.one_more_method_call
else
obj
end
end
Run Code Online (Sandbox Code Playgroud)
(稍微)更清洁的解决方案是以复制为代价避免临时变量:
def not_nice_method
if a_predicate_check?
something_complex(a, b, …Run Code Online (Sandbox Code Playgroud) 是否有一个列表,其中包含没有广泛的类别理论知识的人可以访问的示例?
我正在为Super Combinators所做的努力:
超级组合器是常量或组合器,其仅包含超级组合器作为子表达式.
还有Constant Applicative Forms是什么:
任何不是lambda抽象的超级组合子.这包括真正的常量表达式,如12,((+)1 2),[1,2,3]以及部分应用的函数,如((+)4).请注意,最后一个示例在eta抽象下等效于\ x - >(+)4 x,它不是CAF.
这对我没有任何意义!是不是((+) 4)像12一样"真正不变"?CAF听起来像是我简单心灵的价值观.
我目前正在使用Real World Haskell的第4章,我正试图围绕foldr实现foldl.
(这是他们的代码:)
myFoldl :: (a -> b -> a) -> a -> [b] -> a
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
Run Code Online (Sandbox Code Playgroud)
我以为我会尝试zip使用相同的技术实现,但我似乎没有取得任何进展.它甚至可能吗?
您最有可能写下以下哪项?
r = zip xs $ map sqrt xs
Run Code Online (Sandbox Code Playgroud)
要么
r = [(x, sqrt x) | x <- xs]
Run Code Online (Sandbox Code Playgroud)
互联网上的示例代码似乎表明前者更为丰富且是首选方式.
一个一直困扰我的快速问题.Haskell是否在返回布尔值的函数中执行所有等价测试,即使返回false值也是如此?
例如
f a b = ((a+b) == 2) && ((a*b) == 2)
Run Code Online (Sandbox Code Playgroud)
如果第一个测试返回false,它会在第二个测试之后执行&&吗?或者哈斯克尔是否懒得不去做并继续前进?
许多事情让哈斯克尔非常好的在我看来,使用的组合程序,如(.),flip,$ <*>等这感觉就像当我需要我可以创建新的语法.
前段时间我正在做一些事情,如果我能"翻转"一个类型的构造函数,那将是非常方便的.假设我有一些类型构造函数:
m :: * -> * -> *
Run Code Online (Sandbox Code Playgroud)
并且我有一个类MyClass需要带有类型构造函数的类型* -> *.当然,我会选择以这样的方式对类型进行编码:
instance MyClass (m a)
Run Code Online (Sandbox Code Playgroud)
但是假设我无法改变那些代码,并假设真正适合的代码MyClass就是这样
type w b = m b a
instance MyClass w where
...
Run Code Online (Sandbox Code Playgroud)
然后我必须激活XTypeSynonymInstances.有没有办法创建一个"类型级组合器" Flip,我可以这样做:
instance MyClass (Flip m a) where
...
Run Code Online (Sandbox Code Playgroud)
?? 或者我们在haskell中使用的常见运算符的其他类型级概括?这甚至是有用的还是我只是漫无目的?
编辑:
我可以这样做:
newtype Flip m a b = Flip (m b a)
newtype Dot m w a = Dot m (w a)
...
Run Code Online (Sandbox Code Playgroud)
但后来我不得不使用这些数据构造 …
liftM和mapM有什么区别?
S组合器的模拟是否可以仅使用标准函数(不通过公式定义)并且不使用lambda(匿名函数)在Haskell中表示?我期待它的类型(a -> b -> c) -> (a -> b) -> a -> c.
例如,K组合器的模拟就是const.
实际上我试图\f x -> f x x用标准函数来表达函数,但是不能想到任何标准的非线性函数(这是一个多次使用它的参数的函数).