我正在打包一个Python模块,我希望用户能够使用一些自定义选项构建模块.具体来说,如果你为它提供了可以使用的某些可执行文件,它将会做一些额外的魔术.
理想情况下,用户会运行setup.py install或setup.py install --magic-doer=/path/to/executable.如果他们使用了第二个选项,我会在代码中的某处设置一个变量,并从那里开始.
这可能与Python有关setuptools吗?如果是这样,我该怎么办?
我有一些看起来像这样的haskell样板:
data Configuration
{ confA :: Integer
, confB :: Boolean
, confC :: String }
x = (\arg opt -> opt{ confA=arg })
y = (\arg opt -> opt{ confB=arg })
z = (\arg opt -> opt{ confC=arg })
Run Code Online (Sandbox Code Playgroud)
我想删除样板,产生以下内容:
setter :: (Config -> a) -> a -> Config -> Config
x = setter confA
y = setter confB
z = setter confC
Run Code Online (Sandbox Code Playgroud)
但我不知道如何构建这样的setter功能.这甚至可能在(非模板)haskell中,还是我在这里对抗语法糖?如果是这样,我将如何在模板haskell中做这样的事情?
我有一些非常常见的Haskell样板,它出现在很多地方.它看起来像这样(在实例化类时):
a <= b = (modify a) <= (modify b)
Run Code Online (Sandbox Code Playgroud)
像这样(具有正常功能):
fn x y z = fn (foo x) (foo y) (foo z)
Run Code Online (Sandbox Code Playgroud)
有时甚至是元组,如:
mod (x, y) = (alt x, alt y)
Run Code Online (Sandbox Code Playgroud)
似乎应该有一种简单的方法来减少所有这些样板,而不必重复自己.(这些都是简单的例子,但确实很烦人).我想是为了删除这样的样板而创建的抽象,但我不确定它们被称为什么,也不知道在哪里看.任何haskellites可以指向我正确的方向吗?
长话短说,我有两个正则表达式.一种模式匹配我想要替换的内容,另一种模式匹配那些不应替换的模式的特殊情况.举一个简单的例子,假设第一个是"\ {.*\}",第二个是"\ {\ {.*\} \}".然后应该替换"{this}",但不应该"{{this}}".是否有一种简单的方法来取一个字符串并说"用"hello"替换第一个字符串的所有实例,只要它不匹配第二个字符串"?
换句话说,有没有办法在不修改第一个字符串的情况下轻松制作"匹配第一个字符串而不是第二个字符串"的正则表达式?我知道我可以手动修改我的第一个正则表达式,从不匹配第二个正则表达式的实例,但是随着第一个正则表达式变得更加复杂,这变得非常困难.
我有一个使用Data.Set和Data.IntMap的haskell程序,我需要什么标志才能让GHC将它链接到那些库中?简单的问题,我知道,但手册没有帮助我,我不知道在哪里看.
我想代表yaml的层次结构,我不确定如何.例如,我想说这样的话:
name: "user1"
programming-skill: 3
java: 2
python: 2
cooking-skill: 4
Run Code Online (Sandbox Code Playgroud)
当我在一个yaml解析器中抛出它时,我得到一个错误,就是"在这里不允许映射值"这一行,java: 2因为我正在尝试分配programming-skill给两个3和列表{java: 2, python: 2}.
在yaml中表示这种层次结构的最简洁方法是什么?或者,是否有比yaml更适合分层结构的序列化格式?
我在haskell的正则表达式有些麻烦.特别:
Prelude Text.Regex.Posix> "1" =~ "\d" :: Bool
<interactive>:1:10:
lexical error in string/character literal at character 'd'
Prelude Text.Regex.Posix> "1" =~ "\\d" :: Bool
False
Prelude Text.Regex.Posix> "1" =~ "\\\\d" :: Bool
False
Run Code Online (Sandbox Code Playgroud)
难道哈斯克尔没有\d或\s或其他类似的方便的逃逸代码?是的,我知道我可以做[0-9],但转义代码可以更加方便复杂的正则表达式.我错过了一些明显的东西吗?
我有以下monad转换器来处理Haskell中的错误.
instance (Monad m, Error e) => Monad (EitherT e m) where
return = EitherT . return . return
m >>= k = EitherT $ do
a <- runEitherT m
case a of
Left l -> return (Left l)
Right r -> runEitherT (k r)
fail = EitherT . return . Left . strMsg
Run Code Online (Sandbox Code Playgroud)
它运行得相当好,因为我可以Error使用自定义类进行实例化,并且具有非常灵活的方法来处理错误.
fail但是,有点傻,因为它是类型String -> EitherT e m,String限制可能是一种令人讨厌的创建错误的方法.我最终得到了很多:
instance Error BazError where
strMsg "foo" = FooError -- oh look we have …Run Code Online (Sandbox Code Playgroud) 行.这里的问题非常抽象.忍受我.
我有一堆"单位",每个单位都有一定的属性.这些属性在Seq类中定义,如下所示:
class Seq a x y where
break :: x -> (a, y)
build :: a -> y -> x
Run Code Online (Sandbox Code Playgroud)
从概念上讲,a类型是重要类型,x是用于生成的上下文a,y是用于生成任何其他Seq实例的上下文.break打破Seq,build让你重建它.
在个别Seq情况下,这很好.但是,我也有一个如下所示的数据构造函数:
data a :/: b = a :/: b deriving (Eq, Ord)
infixr :/:
Run Code Online (Sandbox Code Playgroud)
整个操作的目标是能够组合Seq实例.
例如,如果我有a,b并且c所有Seq这些a上下文的实例都被输入b和b输入c,那么我应该自动拥有一个Seq实例a :/: …
我有以下内容:
{-# LANGUAGE TypeFamilies #-}
class Configuration c where
data Pig c
data Cow c
parsePig :: GenParser Char st (Pig c)
parseCow :: GenParser Char st (Cow c)
data Farm c =
{ pigs :: [Pig c]
, cows :: [Cow c]
} deriving Show
Run Code Online (Sandbox Code Playgroud)
由于这deriving Show条线,这失败了.我不知道如何强制所有Configuration实例确保它们data Pig和data Cow实现都是实例Show.
我知道我可以创造它showPig和showCow方法,并写出整个复杂的show实例,但实际上事情比这更复杂,这将是一个非常痛苦.
是否有一种简单,优雅的方法来保证类型族实例本身就是某些类的实例?