为了在Python中编写"分段函数",我通常使用if(在控制流或三元运算符形式).
def spam(x):
return x+1 if x>=0 else 1/(1-x)
Run Code Online (Sandbox Code Playgroud)
现在,有了NumPy,我们的口头禅是为了避免在单个值上进行矢量化,以获得性能.所以我认为这样的事情会更受欢迎:正如Leon所言,以下是错误的
def eggs(x):
y = np.zeros_like(x)
positive = x>=0
y[positive] = x+1
y[np.logical_not(positive)] = 1/(1-x)
return y
Run Code Online (Sandbox Code Playgroud)
(纠正我,如果我在这里错过了一些东西,因为坦率地说,我觉得这很难看.)
现在,当然只有在实际上是一个NumPy数组eggs时才会起作用x,因为否则x>=0只会产生一个布尔值,它不能用于索引(至少不做正确的事情).
有没有一种很好的方法来编写看起来更像是spam在Numpy数组上惯用的代码,或者我应该使用vectorize(spam)?
zoom 允许我们在实际定义了更多变量的上下文中使用仅使用某些状态变量的状态操作.
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Monad.Trans.State
import Control.Monad.IO.Class
data Galaxy = Galaxy {
_solarSys :: SolarSystem
, _otherStars :: String
} deriving (Show)
data SolarSystem = SolarSystem {
_sun :: Float
, _planets :: Int
} deriving (Show)
makeLenses ''SolarSystem
makeLenses ''Galaxy
main = (`runStateT`Galaxy (SolarSystem 2e+30 8) "") $ do
zoom solarSys $ do
sun -= 1e+23
planets += 1
liftIO . print =<< get
Run Code Online (Sandbox Code Playgroud)
Galaxy {_solarSys = SolarSystem {_sun = 1.9999999e30, _planets = 9}, … 可以用作超/下标字母的字符排列似乎完全混乱.其中大多数显然不打算用作sup/subscr.信件,但即使是那些没有提示非常合理的订单.在Unicode 6.0中,现在终于在U + 2095到U + 209C中有下划线字母ht的按字母排序的子集,但这明显相当于块中的剩余空间并且包含不到所有字母的1/3 .
为什么联盟不仅仅为小写字母分配至少一个sup和一个下标字母表的足够空间?
嗯...... - 显然,没什么!如果我试试
Prelude Control.Concurrent.Async Data.List> do {_ < - async $ return $!foldl'(+)0 [0,0.1 .. 1e + 8 :: Double]; 打印"异步丢失!"}
"异步丢失!"
一个处理器核心开始疯狂一段时间,界面保持正常.显然线程已启动,只要有事情要做就可以运行.
但是(效率除外),原则上是好的,还是必须Async始终被cancel引导或wait编辑?有什么东西会破坏,因为没有办法再读取结果吗?GC是否正确清理了一切?事实上,这个线程可能会被停止,而当我尝试它时(由于内存压力不足)这种情况还没有发生?线程是否正确地"结束",只是当forkIOed动作结束时?
我对这种并发性的东西很不确定.也许我仍然在用C++方式考虑这个问题.RAII /确定性垃圾收集肯定会让你在这方面感受到更好的照顾......
我刚开始学习函数式编程,我的选择是haskell.好几天都没问题,直到控制台发生了一些奇怪的事情
起初我认为教程(http://learnyouahaskell.com/starting-out)是错误的
Prelude> [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]
[(1,1,1)]
Run Code Online (Sandbox Code Playgroud)
它应该是(3,4,5)和(4,6,8).我尝试过3^2+5^2,它吐出了大量的数字(类似于60行数字,大约3000位数字); 4^2+3^2似乎产生了相同的数字.
试图添加任何数字结果 100
Prelude> 100 + 200
100
Prelude> 300 + 500
100
Run Code Online (Sandbox Code Playgroud)
我关闭窗口并重新打开它,问题就解决了.
这种错误计算经常发生在Haskell吗?或者下载时我的Haskell版本可能已损坏?或者这是一个罕见的错误吗?
要创建一个接受类型级自然Z,(SZ),(S(SZ))...等的类型类,您可以简单地递归声明实例:
data Z
data S a
class Type a
instance Type Z
instance Type (S a)
Run Code Online (Sandbox Code Playgroud)
是否可以基于类型级谓词创建类型类实例?例如,我希望能够说:
{-# LANGUAGE MultiParamTypeClasses #-}
class Type a b
instance Type x y when (x :+: y == 8)
Run Code Online (Sandbox Code Playgroud)
:+:类型级别添加在哪里,并且==是类型级别相等Data.Type.Equality,因此仅为最多为8的nat对创建实例.
Haskell中的符号是否与此类似?如果没有,这样的事情将如何实现?
编辑:这篇文章的灵感来自关于智能构造函数的Haskell wiki文章,其中InBounds声明了一个类型类以静态验证传递给智能构造函数的幻像类型参数是在某些范围的Nats中,智能构造函数是:
resistor :: InBounds size => size -> Resistor size
resistor _ = Resistor
Run Code Online (Sandbox Code Playgroud)
在我的例子中尝试做类似的事情(在使用leftaroundabout的答案之后)给了我一个错误:
construct :: (Type a b) => a -> b -> MyType a b
construct _ _ …Run Code Online (Sandbox Code Playgroud) {-# LANGUAGE PatternSynonyms, ViewPatterns #-}
data Quun = Foo | Bar | Oink Quun
fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink Yum) = True
fooey _ = False
pattern Yum <- (fooey -> True)
Run Code Online (Sandbox Code Playgroud)
这不编译(至少在GHC-7.10.2中)
/tmp/wtmpf-file10227.hs:1:1:
Recursive pattern synonym definition with following bindings:
foo (defined at /tmp/wtmpf-file10227.hs:(6,1)-(8,13))
Yum (defined at /tmp/wtmpf-file10227.hs:10:1-28)
Run Code Online (Sandbox Code Playgroud)
当然,对于简单的直接自我引用模式,这是有意义的.但是,有一些基本原因导致即使是如上所述的视图模式中介布局也不可能吗?我无法找到令人信服的; 毕竟,可以内联视图模式并获得完全无害的(至少是允许的)定义:
fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink (fooey -> True)) = True
fooey _ = False
pattern …Run Code Online (Sandbox Code Playgroud) 类似的类型Maybe (Lens' a b)不起作用,因为Lens'在引擎盖下是Rank-2类型,不能在没有-XImpredicativeTypes扩展名的类型构造函数中包装(在GHC中实际上不支持).
因此,提供一个在道德上具有类型的函数的最佳类型是什么
foo :: A -> Maybe (Lens' B C)
Run Code Online (Sandbox Code Playgroud)
一种可能性是推迟Maybe到通过的延续
foo' :: ? y . A -> (Lens' B C -> y) -> Maybe y
Run Code Online (Sandbox Code Playgroud)
但我并不特别喜欢.
import Control.Lens
import Control.Lens.TH
data Foo = Foo {
_bar, _baz :: Int
}
makeLenses ''Foo
Run Code Online (Sandbox Code Playgroud)
现在,如果我想修改两个int字段,我可以做
barbaz :: Setter' Foo Int
barbaz = sets $ \foo f -> foo & bar %~ f
& baz %~ f
Run Code Online (Sandbox Code Playgroud)
但这似乎是一种非常难看的手动方式.
使用镜头/箭头组合器可以直接实现吗?
haskell ×8
haskell-lens ×3
lenses ×3
arrays ×1
arrows ×1
concurrency ×1
numpy ×1
python ×1
recursion ×1
state-monad ×1
types ×1
unicode ×1