小编mhw*_*bat的帖子

在StateT中组合多个状态

我正在编写一个作为守护进程运行的程序.要创建守护程序,用户为每个必需的类提供一组实现(其中一个是数据库)所有这些类的函数都具有表单的类型签名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)

state haskell

16
推荐指数
3
解决办法
2240
查看次数

除非或何时将一个monadic表达式引入

我经常发现自己编写的代码如下:

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)

这里最好的方法是什么?

monads haskell

11
推荐指数
2
解决办法
2181
查看次数

找不到"六",但它已经安装好了

我已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)

python centos six-python

10
推荐指数
1
解决办法
4465
查看次数

将"裸"数字分配给newtypes

请注意此GHCi会话中的第二行.什么是Latitude类型允许我使用"裸"数作为值,而不是必须调用构造函数?我想用我自己的一些类型做类似的事情.

?> :m + Data.Geo.GPX.Type.Latitude                                                                                                   
?> let t = 45 :: Latitude                                                                                                            
?> t                                                                                                                                 
45.0
Run Code Online (Sandbox Code Playgroud)

我已经检查了Latitude类型的源代码,但我一开始很难搞清楚它.最终我找到了答案,所以我想我会在这里记录下来.请参阅下面的答案.

haskell pragma

9
推荐指数
2
解决办法
242
查看次数

确保文件立即关闭

我正在编写一个守护进程,它从一个小文件中读取内容,修改它,然后将其写回同一个文件.在尝试写入之前,我需要确保每个文件在阅读后立即关闭.我还需要确保每个文件在写完后立即关闭,因为我可能偶尔会立即再次阅读它.

我已经研究过使用二进制严格而不是二进制,但似乎只提供严格的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)

io haskell file strict

9
推荐指数
2
解决办法
774
查看次数

f1 =翻转const map.这个功能如何运作?

假设我们有这个无点函数:

f1 = flip const map
Run Code Online (Sandbox Code Playgroud)

我对它究竟是如何工作以及它应该做什么一无所知?即我知道map,const和flip函数是什么.但是把这些放在一起对我来说没有意义.这个功能究竟发生了什么?它似乎返回了我每次传递给它的同样的东西,但是......为什么?

haskell const map flip pointfree

9
推荐指数
3
解决办法
885
查看次数

Cabal和--no-require-sandbox

在我的~/.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.

haskell cabal-install

8
推荐指数
1
解决办法
316
查看次数

无法识别的'configure'选项`--enable-executable-profiling'

从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)

haskell ghc cabal

8
推荐指数
1
解决办法
404
查看次数

根据GHC 7.10.1和cabal 1.23进行分析的程序是什么?

在GHC 7.10.1和cabal 1.23下建议的分析程序是什么?来自GHC和cabal-install的与性能分析相关的错误和警告消息非常不一致.

  1. 尝试使用性能分析运行可执行文件,然后告诉您:

    $ prediction-interactive +RTS -p
    
    prediction-interactive: the flag -p requires the program to be built with -prof
    
    Run Code Online (Sandbox Code Playgroud)
  2. 放入-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)
  3. 遵循该建议(并从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)
  4. 遵循这个建议,你被告知:

    $ cabal configure --enable-profiling
    
    Resolving dependencies...
    Configuring creatur-wains-prediction-1.0...
    
    $ cabal build …
    Run Code Online (Sandbox Code Playgroud)

profiling haskell ghc cabal-install

8
推荐指数
0
解决办法
280
查看次数

在REPL中使用重写

对于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)

idris

8
推荐指数
1
解决办法
105
查看次数

标签 统计

haskell ×8

cabal-install ×2

ghc ×2

cabal ×1

centos ×1

const ×1

file ×1

flip ×1

idris ×1

io ×1

map ×1

monads ×1

pointfree ×1

pragma ×1

profiling ×1

python ×1

six-python ×1

state ×1

strict ×1