Haskell的新手,我正试图找出这个Monad的东西.monadic绑定运算符 - >>=具有非常奇特的类型签名:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
为了简化,我们替换Maybe为m:
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)
但请注意,该定义可以用三种不同的方式编写:
(>>=) :: Maybe a -> (Maybe a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> ( a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> ( a -> b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)
在这三个中,中心的一个是最不对称的.但是,据我所知,如果我们想避免(LYAH称为样板代码),第一个有点无意义.但是,接下来的两个,我更喜欢最后一个.对于 …
我正在Haskell中编写一个(实际上是我的第一个)大型程序,并试图将我的程序分解为模块,这样可能更容易维护.在Haskell中,模块名称似乎取决于目录结构.这非常好,直到我必须为程序嵌入另一层目录结构.我给出一个非常简单的例子如下:
让我们说我们开始使用具有以下目录结构的Haskell程序.
[src]
- (Main.hs) {Main}
- (PRBS.hs) {PRBS}
- [Hardware]
- (DataDef.hs) {Hardware.DataDef}
- (ShiftRegister.hs) {Hardware.ShiftRegister}
Run Code Online (Sandbox Code Playgroud)
这一切都很好.我可以在任何我想要的地方导入我想要的东西.但是,现在说我想创建另一个抽象级别,如下所示:
[src]
- (Main.hs) {Main}
- [Firmware]
- (PRBS.hs) {Firmware.PRBS}
- [Hardware]
- (DataDef.hs) {Firmware.Hardware.DataDef}
- (ShiftRegister.hs) {Firmware.Hardware.ShiftRegister}
Run Code Online (Sandbox Code Playgroud)
现在请注意,硬件中所有模块的名称都已更改.我现在必须更改每个文件中的模块名称,以及导入文件的所有其他文件.我在一个例子中展示的三个文件.如果目录结构最终有数百个带有数十个嵌入目录的文件,则可能无法维护代码.此外,如果在任何时候,我想(在当前目录系统中的特定点及其子目录)复制的目录,我需要弄清楚面前所有而来以前的目录,并手动更改在每个模块名称文件.
由于Haskell用于几个大型项目,我很确定我在这里遗漏了一些东西.任何帮助我摆脱这个泥潭的帮助将不胜感激!
所以我在一个tmux会话中,我不小心按下了C-b t.现在恰好是一个"大钟"模式.我无法退出这种模式.:((.帮助..会话在后台运行一个长期的过程.
假设我有以下字符串
string = "serial 7's 93-86-79-72-65 very slow, recall 3/3 "
Run Code Online (Sandbox Code Playgroud)
现在,我想在 Python 中使用正则表达式找到一组数字。请注意,数字前面必须有"serial 7's"我尝试过的以下内容:
re.findall('(?<=serial 7\'s )(\d+, )', string)
re.findall('(?<=serial 7\'s )(\d+, )+', string)
Run Code Online (Sandbox Code Playgroud)
似乎没有任何效果。请注意,我们尝试提取的整数数量可能未知。我只想要具有特定模式的数字。不是其他可能分散在文本中的数字。
预期输出: ['93','86','79','72','65']
我想创建一个class用于数据库访问的数据库,其中我希望程序员可以选择在上下文管理器(语句with)中使用该类。所以我尝试使用以下代码:
class dbAccess:
def __init__(self, fileName):
self.conn = sql.connect(fileName)
self.c = conn.cursor()
def __enter__(self, fileName):
self.conn = sql.connect(fileName)
self.c = conn.cursor()
def __exit__(self):
self.conn.close()
Run Code Online (Sandbox Code Playgroud)
现在我还希望用户能够在上下文管理器之外使用它。就像文件一样open()。所以我想知道如何知道是否self.conn已经连接到数据库,以便用户使用它时,他/她不会遇到冲突?基本上,我想做类似的事情:
def __enter__(self, fileName):
if not alreadyConnected():
self.conn = sql.connect(fileName)
self.c = conn.cursor()
Run Code Online (Sandbox Code Playgroud)
那么我该如何找出这个alreadyConnected函数呢?
Haskell新手在这里请原谅,如果问题太简单了.它只是我似乎无法处理为什么文件中的某些东西是好的,但在GHCI中没有.例如,我在文件中有以下行:
showLst :: [[Int]] -> IO ()
showLst = putStrLn . unlines . map show
Run Code Online (Sandbox Code Playgroud)
这需要一个m × n数组并在屏幕上打印结果.一个非常方便的功能.但是,当我快速检查GHCI并且我想要相同的功能时,我尝试在GHCI中定义相同的功能,如下所示:
>> let showLst = putStrLn . unlines . map show
>> showLst [[1,2,3], [4,5,6], [7,8,9]]
Run Code Online (Sandbox Code Playgroud)
我收到类型错误.所以我尝试了几种变化:
>> (showLst [[1,2,3], [4,5,6], [7,8,9]]) :: IO ()
>> (showLst:: [[Int]] -> IO ()) [[1,2,3], [4,5,6], [7,8,9]]
>> (showLst [[1,2,3], [4,5,6], [7,8,9]]) :: [[Int]] -> IO () -- which us wrong anyway
>> showLst [[1,2,3], [4,5,6], [7,8,9]] :: [[Int]] -> IO () -- which …Run Code Online (Sandbox Code Playgroud) 假设我们创建了一个小型网络:
tf.reset_default_graph()
layers = [5, 3, 1]
activations = [tf.tanh, tf.tanh, None]
inp = tf.placeholder(dtype=tf.float32, shape=(None, 2 ), name='inp')
out = tf.placeholder(dtype=tf.float32, shape=(None, 1 ), name='out')
isTraining = tf.placeholder(dtype=tf.bool, shape=(), name='isTraining')
N = inp * 1 # I am lazy
for i, (l, a) in enumerate(zip(layers, activations)):
N = tf.layers.dense(N, l, None)
#N = tf.layers.batch_normalization( N, training = isTraining) # comment this line
if a is not None:
N = a(N)
err = tf.reduce_mean((N - out)**2)
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with …Run Code Online (Sandbox Code Playgroud) 从Haskell开始,一直停留在State Monad ......
所以我试图在Haskell中掌握State Monad,并理解它,我正在编写一个代码来生成PRBS序列.对于感兴趣的人,它在论文'Pseudo Random Sequences and Arrays'中描述,其免费副本可以通过doi获得:10.1109/PROC.1976.10411.
必要的代表团很简单.你有一个移位寄存器和一个生成多项式.生成多项式告诉您移位寄存器的哪些位采用并求和(模2)以获得移位寄存器的MSB.在下一次迭代中,您采用此计算的MSB并在执行右移操作后将其粘贴到移位寄存器的MSB .
没有monad这样做的代码非常简单:
import Data.List
m = (4::Int) -- This is the degree of the polynomial
p = tail $ [4, 1, 0] -- This is a actual polynomial
s = 1 : replicate (m-1) 0 -- This is the initial state. Note that the head is the MSB
chSt poly s = msb poly s : init s -- changes the shift …Run Code Online (Sandbox Code Playgroud) 在尝试编写一个用于转置列表列表的函数时,我看到了一些非常好奇的东西.我试过了:
> let abc xs | null (head xs) = [] | otherwise = map head xs : abc $ map tail xs
Run Code Online (Sandbox Code Playgroud)
并得到一个错误.然后我尝试了:
> let abc xs | null (head xs) = [] | otherwise = map head xs : abc ( map tail xs )
> abc [[1,2,3], [4,5,6], [7,8,9]]
[[1,4,7],[2,5,8],[3,6,9]]
Run Code Online (Sandbox Code Playgroud)
我被引导相信$可以使用运算符而不是括号,而那更像是Haskellish.为什么我收到错误?
假设我们有一个如下所示的文档结构
.
|____src
| |____abc.py
|____docs
Run Code Online (Sandbox Code Playgroud)
现在我们使用以下命令生成文档:
sphinx-apidoc -F -o docs src
Run Code Online (Sandbox Code Playgroud)
这会在./docs/文件夹中生成多个文件,其中包括./docs/abc.rst,我现在可以使用文件夹make html中的来构建它./docs/。
现在,在添加一些附加功能后,./src/abc.py我想重建文档。我尝试了同样的操作,Sphinx 说其余文件已经存在,因此它没有得到更新。我必须手动删除相关文件才能更新文档。
现在的问题是,如何在不删除.rst文件的情况下完成整个过程。
我们说,我们有以下代码:
from sys import exit
def parseLine(l):
if '#' not in l:
print 'Invalid expresseion'
exit(1)
return l
with open('somefile.txt') as f:
for l in f:
print parseLine(l)
Run Code Online (Sandbox Code Playgroud)
(请注意,这是一个演示代码.实际的程序要复杂得多.)
现在,当我退出程序时,如何知道是否已安全关闭所有打开的文件?此时我只是假设文件已经关闭.目前我的程序工作正常,但我希望它们健壮,没有与未正确关闭的文件相关的问题.
haskell ×5
python ×3
python-3.x ×2
brackets ×1
monads ×1
operators ×1
regex ×1
sqlite ×1
state-monad ×1
tensorflow ×1
tmux ×1
typeclass ×1
types ×1