我正在编写一个作为守护进程运行的程序.要创建守护程序,用户为每个必需的类提供一组实现(其中一个是数据库)所有这些类的函数都具有表单的类型签名StateT s IO a,但s每个类都有所不同.
假设每个类都遵循以下模式:
import Control.Monad (liftM)
import Control.Monad.State (StateT(..), get)
class Hammer h where
driveNail :: StateT h IO ()
data ClawHammer = MkClawHammer Int -- the real implementation is more complex
instance Hammer ClawHammer where
driveNail = return () -- the real implementation is more complex
-- Plus additional classes for wrenches, screwdrivers, etc.
Run Code Online (Sandbox Code Playgroud)
现在我可以定义一条记录,表示用户为每个"槽"选择的实现.
data MultiTool h = MultiTool {
hammer :: h
-- Plus additional fields for wrenches, screwdrivers, etc.
} …Run Code Online (Sandbox Code Playgroud) 我经常发现自己编写的代码如下:
import System.Directory (doesFileExist)
import Control.Monad (unless)
example = do
fileExists <- doesFileExist "wombat.txt"
unless fileExists $ putStrLn "Guess I should create the file, huh?"
Run Code Online (Sandbox Code Playgroud)
也许更好的方法是:
example2 =
doesFileExist "wombat.txt" >>=
(\b -> unless b $ putStrLn "Guess I should create the file, huh?")
Run Code Online (Sandbox Code Playgroud)
这里最好的方法是什么?
我已six安装(甚至重新安装).
$ pip show six
---
Name: six
Version: 1.7.3
Location: /usr/lib/python2.6/site-packages
Requires:
Run Code Online (Sandbox Code Playgroud)
但是当我试图跑步时csvcut,它找不到它.
$ csvcut -n monster.csv
Traceback (most recent call last):
File "/usr/bin/csvcut", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
working_set.require(__requires__)
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: six>=1.6.1
Run Code Online (Sandbox Code Playgroud)
这是相关的但是csvcut:
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'csvkit==0.8.0','console_scripts','csvcut'
__requires__ = 'csvkit==0.8.0'
import sys
from pkg_resources import load_entry_point
if …Run Code Online (Sandbox Code Playgroud) 请注意此GHCi会话中的第二行.什么是Latitude类型允许我使用"裸"数作为值,而不是必须调用构造函数?我想用我自己的一些类型做类似的事情.
?> :m + Data.Geo.GPX.Type.Latitude
?> let t = 45 :: Latitude
?> t
45.0
Run Code Online (Sandbox Code Playgroud)
我已经检查了Latitude类型的源代码,但我一开始很难搞清楚它.最终我找到了答案,所以我想我会在这里记录下来.请参阅下面的答案.
我正在编写一个守护进程,它从一个小文件中读取内容,修改它,然后将其写回同一个文件.在尝试写入之前,我需要确保每个文件在阅读后立即关闭.我还需要确保每个文件在写完后立即关闭,因为我可能偶尔会立即再次阅读它.
我已经研究过使用二进制严格而不是二进制,但似乎只提供严格的Get,而不是严格的Put.与System.IO.Strict相同的问题.从阅读二进制严格的文档,我不确定它真的解决了我确保文件被迅速关闭的问题.处理这个问题的最佳方法是什么?DeepSeq?
这是一个高度简化的示例,可以让您了解我的应用程序的结构.此示例以.结尾
*** Exception: test.dat: openBinaryFile: resource busy (file is locked)
原因很明显.
import Data.Binary ( Binary, encode, decode )
import Data.ByteString.Lazy as B ( readFile, writeFile )
import Codec.Compression.GZip ( compress, decompress )
encodeAndCompressFile :: Binary a => FilePath -> a -> IO ()
encodeAndCompressFile f = B.writeFile f . compress . encode
decodeAndDecompressFile :: Binary a => FilePath -> IO a
decodeAndDecompressFile f = return . decode . decompress =<< B.readFile f
main = do
let i = …Run Code Online (Sandbox Code Playgroud) 假设我们有这个无点函数:
f1 = flip const map
Run Code Online (Sandbox Code Playgroud)
我对它究竟是如何工作以及它应该做什么一无所知?即我知道map,const和flip函数是什么.但是把这些放在一起对我来说没有意义.这个功能究竟发生了什么?它似乎返回了我每次传递给它的同样的东西,但是......为什么?
在我的~/.cabal/config档案中,我有
require-sandbox: True
Run Code Online (Sandbox Code Playgroud)
根据Cabal用户指南,我应该能够像这样覆盖:
amy@wombat$ cabal install xmonad xmonad-contrib --no-require-sandbox
cabal: unrecognized 'install' option `--no-require-sandbox'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我正在使用cabal-install版本1.21.0.0.
从ghc 7.8.3升级到ghc 7.8.4后,我做了一个cabal update,看到有一个新版本的cabal.所以我运行了命令
cabal --no-require-sandbox install cabal-install
Run Code Online (Sandbox Code Playgroud)
并收到错误消息
unrecognized 'configure' option `--enable-executable-profiling'
Run Code Online (Sandbox Code Playgroud) 在GHC 7.10.1和cabal 1.23下建议的分析程序是什么?来自GHC和cabal-install的与性能分析相关的错误和警告消息非常不一致.
尝试使用性能分析运行可执行文件,然后告诉您:
$ prediction-interactive +RTS -p
prediction-interactive: the flag -p requires the program to be built with -prof
Run Code Online (Sandbox Code Playgroud)放入-prof你的cabal文件,你会被告知:
$ cabal build
Warning: 'ghc-options: -prof' is not necessary and will lead to problems when
used on a library. Use the configure flag --enable-library-profiling and/or
--enable-executable-profiling.
Run Code Online (Sandbox Code Playgroud)遵循该建议(并从cabal文件中删除-prof),并告诉您:
$ cabal configure --enable-executable-profiling
Resolving dependencies...
Configuring creatur-wains-prediction-1.0...
Warning: The flag --enable-executable-profiling is deprecated. Please use
--enable-profiling instead.
Run Code Online (Sandbox Code Playgroud)遵循这个建议,你被告知:
$ cabal configure --enable-profiling
Resolving dependencies...
Configuring creatur-wains-prediction-1.0...
$ cabal build …Run Code Online (Sandbox Code Playgroud)对于Idris的类型驱动开发中的一项练习,我写了以下内容:
myPlusCommutes : (n : Nat) -> (m : Nat) -> n + m = m + n
myPlusCommutes Z m = rewrite plusZeroRightNeutral m in Refl
myPlusCommutes (S n) m =
rewrite myPlusCommutes n m in
rewrite plusSuccRightSucc m n in Refl
Run Code Online (Sandbox Code Playgroud)
然后我想rewrite在REPL中玩转,这样我就可以“看到”幕后发生的事情。我认为以下方法可能会起作用,但事实并非如此。
??> :let m : Nat
defined
??> :let s : (plus 0 m = plus m 0)
defined
??> rewrite plusZeroRightNeutral m in s
rewriting plus m 0 to m did not …Run Code Online (Sandbox Code Playgroud)