如果要使用GHC的词法范围变量,则还必须使用显式通用量化.也就是说,您必须向forall
函数的类型签名添加声明:
{-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}
f :: forall a . [a] -> [a] -- The `forall` is required here ...
f (x:xs) = xs ++ [x :: a] -- ... to relate this `a` to the ones above.
Run Code Online (Sandbox Code Playgroud)
这实际上与量化有什么关系,或者扩展编写者是否只是将forall
关键字作为一个方便的标记来应用新的,更广泛的范围?
换句话说,为什么我们不能forall
像往常一样抛弃?是不是很清楚函数体内注释中的类型变量是否引用了函数签名中同名的变量?或者打字会不会有问题或含糊不清?
matplotlib的轴格式化选项在绘制和有效标记密集时间序列数据时往往会趋于平缓.
一个问题是刻度标签与刻度线相关联,因此如果您以适当的频率设置轴刻度,则通常会有太多标签.这也意味着,如果您在几年的时间内绘制日常数据,那么就没有好的方法来标记每年处于其自然位置的x轴:以年份数据为中心(即,在x下) - 7月2日或之后的轴位置.
在这个例子中描述的技巧-set major ticks你想要它们,然后使用不可见的小刻度将标签放在别处 - 工作,但它限制你到一组可见的轴刻度(因为每个轴限于一组主要和一组次要的蜱虫).你不能在每年年初开始显示主要价格,在每月开始时显示次要价格,而不会放弃在主要(年度)价格之间放置年份标签的能力,正如您在出版物中所看到的那样 - 质量图.
是否有解决方法不涉及完全手动绘制所有内容?
由于它们是在绘图区域内绘制的,因此许多matplotlib图中的数据会使轴刻度变得模糊.更好的方法是绘制从轴向外延伸的刻度线,如ggplot
R的绘图系统中的默认值.
从理论上讲,这可以通过重新绘制与所述刻度线来完成TICKDOWN
和TICKLEFT
线样式的x轴和y轴分别蜱:
import matplotlib.pyplot as plt
import matplotlib.ticker as mplticker
import matplotlib.lines as mpllines
# Create everything, plot some data stored in `x` and `y`
fig = plt.figure()
ax = fig.gca()
plt.plot(x, y)
# Set position and labels of major and minor ticks on the y-axis
# Ignore the details: the point is that there are both major and minor ticks
ax.yaxis.set_major_locator(mplticker.MultipleLocator(1.0))
ax.yaxis.set_minor_locator(mplticker.MultipleLocator(0.5))
ax.xaxis.set_major_locator(mplticker.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(mplticker.MultipleLocator(0.5))
# Try to set the tick markers …
Run Code Online (Sandbox Code Playgroud) 当元编程时,传递Haskell的类型系统信息可能是有用的(或必要的),这些信息是关于程序已知但在Hindley-Milner中不可推断的类型.是否有一个库(或语言扩展等)提供了执行此操作的工具 - 即Haskell中的编程类型注释?
考虑一种情况,即您正在使用异构列表(使用Data.Dynamic
库或存在量化实现,比如说),并且您希望将列表过滤到沼泽标准,同质类型的Haskell列表.你可以写一个像这样的函数
import Data.Dynamic
import Data.Typeable
dynListToList :: (Typeable a) => [Dynamic] -> [a]
dynListToList = (map fromJust) . (filter isJust) . (map fromDynamic)
Run Code Online (Sandbox Code Playgroud)
并使用手动类型注释调用它.例如,
foo :: [Int]
foo = dynListToList [ toDyn (1 :: Int)
, toDyn (2 :: Int)
, toDyn ("foo" :: String) ]
Run Code Online (Sandbox Code Playgroud)
这foo
是清单[1, 2] :: [Int]
; 这很好,你回到了坚实的基础,Haskell的类型系统可以做到这一点.
现在想象你想要做同样的事情,但是(a)当你编写代码时,你不知道调用产生的列表类型是什么dynListToList
,但是(b)你的程序确实包含只有(c)它不是类型系统可访问的形式.
例如,假设您从异类列表中随机选择了一个项目,并且希望按该类型过滤列表.使用提供的类型检查工具Data.Typeable
,您的程序具有执行此操作所需的所有信息,但据我所知 - 这是问题的本质 - 没有办法将其传递给类型系统.这是一些伪Haskell,它显示了我的意思:
import Data.Dynamic
import Data.Typeable
randList :: (Typeable a) …
Run Code Online (Sandbox Code Playgroud) 表达式\x -> y
通常由Haskell程序员发音?
我问,因为我通常说"lambda eks dot为什么",因为它是?x.y
在一般背景下写的,我通过书籍和笔记介绍了lambda演算,没有听到任何人将这些术语翻译成语音.但是在Haskell中它是一个箭头,而不是一个点.
据我所知,计算机科学界的人常常忽视语音中的点("lambda eks [short pause] y").网络告诉我,F#和C#程序员经常发出相同的表达方式x => y
,称"eks为什么会这样".我不知道在其他情况下如何表达相似的结构.
在Haskellers中,它是"lambda eks arrow为什么",或者是什么?
我试图在Mac OS X上给HsOpenSSL一个旋风,它在我脸上爆炸了.
最新的Hackage版本(HsOpenSSL-0.10.3.3)构建和导入,但用它做任何事都会导致我的GHCi(7.6.3和7.4.2)被杀死:
ghci> import OpenSSL
ghci> withOpenSSL $ do undefined
$ # Now I'm looking at a shell prompt
Run Code Online (Sandbox Code Playgroud)
我把一个可执行文件放在一起并用GHC构建它,而且是一个段错误:
$ ./test
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
我正在使用OS X 10.8附带的OpenSSL版本:
$ openssl version
OpenSSL 0.9.8r 8 Feb 2011
Run Code Online (Sandbox Code Playgroud)
(我现在也安装了最新版本的OpenSSL,v1.0.1e,并针对它构建了HsOpenSSL.再次构建和导入很好,但在任何调用OpenSSL时都会出现段错误.)
这可能是OpenSSL的问题,或者使用OS X而不是Linux的一些特性,但我的安装在Python的OpenSSL库中运行良好....
任何人都可以复制这个,或者给我任何调试技巧?
haskell ×4
matplotlib ×2
plot ×2
python ×2
type-systems ×2
ghc ×1
lambda ×1
macos ×1
openssl ×1
quantifiers ×1
ssl ×1
types ×1