小编Alf*_*oli的帖子

Clojure中的高阶函数

Clojure很棒,我们都知道这一点,但这不是重点.我想知道以类似Haskell的方式创建和管理高阶函数的惯用方法是什么.在Clojure中,我可以执行以下操作:

(defn sum [a b] (+ a b))
Run Code Online (Sandbox Code Playgroud)

但是(sum 1)不返回函数:它会导致错误.当然,你可以这样做:

(defn sum
  ([a] (partial + a)) 
  ([a b] (+ a b)))
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

user=> (sum 1)
#<core$partial$fn__3678 clojure.core$partial$fn__3678@1acaf0ed>
user=> ((sum 1) 2)
3
Run Code Online (Sandbox Code Playgroud)

但这似乎不是正确的方法.有任何想法吗?
我不是在谈论实现这个sum功能,我正在谈论更高层次的抽象.是否有任何惯用模式可供遵循?有些宏?是定义宏的最佳方式还是有替代解决方案?

clojure currying higher-order-functions

36
推荐指数
2
解决办法
1万
查看次数

哪个是比喻字符和字符串的clojuresque方法?(单个字符串)

我想知道在Clojure中比较字符和字符串的最佳(clojuresque)方法.显然,类似的东西会返回false:

(= (first "clojure") "c")
Run Code Online (Sandbox Code Playgroud)

因为first首先返回一个java.lang.Character,而"c"是一个单字符串.是否存在直接比较char和string而不调用强制转换的构造?我没有找到与此不同的方法:

(= (str (first "clojure")) "c")
Run Code Online (Sandbox Code Playgroud)

但我不满意.有任何想法吗?再见,阿尔弗雷多

string character clojure

28
推荐指数
3
解决办法
1万
查看次数

如何设计monadic堆栈?

你如何设计和构建你的monadic堆栈?我第一次需要构建一个monadic堆栈(使用变换器)来解决现实问题,但我并不完全确定堆叠变换器的顺序.如你所知,只要计算有点* -> *,基本上任何东西都可以在变换器中扮演内部monad的角色,因此有几个问题:

  • 一些特定的变压器应该在堆栈的顶部(例如ReaderT?WriterT?)
  • 什么应该驱动设计?直觉?类型?(例如根据API的需要塑造堆栈)
  • 每个堆栈是否彼此同形(在某种程度上)或者可能是,如果我错误地构建我的堆栈,我可能最终无法使用某些底层monad或者有一个大臃肿的混乱lift . lift . liftIO [...]?我的直觉是,如果变形金刚得到一些实例(例如MonadReader,MonadIO等,就像大多数变形金刚mtl一样),那么放置变压器的顺序并不重要.

我有兴趣听取经验丰富的Haskellers关于最佳实践或经验法则的意见.

forever $ print "Thanks!"

一个.

haskell types design-patterns monad-transformers

22
推荐指数
2
解决办法
834
查看次数

在admin中按外键ID搜索

我试图实现一些看似简单的东西,但我无法找到任何答案,无论是在谷歌还是在这里.我有一个Django模型,简单的东西:

class Shipment(models.Model):
    id = models.AutoField(primary_key=True)
    transaction = models.ForeignKey(Transaction)
Run Code Online (Sandbox Code Playgroud)

我希望能够通过transaction.id在我的发货管理页面中进行搜索.为了清楚起见,我想要这个(这段代码显然不起作用):

class ShipmentAdmin(admin.ModelAdmin):
    list_display = ('id', 'transaction')
    search_fields = ['id', 'transaction.id']
Run Code Online (Sandbox Code Playgroud)

这不起作用导致transaction.id没有命名字段.任何的想法?通过"搜索",我的意思是能够在"货件管理"页面的搜索框中插入我的交易ID,按"搜索"并自动检索适当的交易.

django search foreign-keys django-admin

16
推荐指数
2
解决办法
1万
查看次数

如何防止Emacs调整窗口大小?

我的Lisp工作环境将框架拆分为两个窗口,前者用于主编码,后者用于我的粘液评估.

不幸的是,当我犯了一些错误(因为我还在学习Lisp:P)时,粘液调试器警告我,并且这样做会显示在自动调整大小的底部窗口中.只是为了更明确:

之前:

_______
|     |
|     |
_______
|_____|
Run Code Online (Sandbox Code Playgroud)

后:

_______
|     | <- decreased in size!
_______
|_____| <- increased in size!
Run Code Online (Sandbox Code Playgroud)

如何防止Emacs调整窗口大小?我希望Emacs让我的窗口大小相同.

我怎么能做到这一点?

谢谢!再见!

阿尔弗雷多

emacs resize window

10
推荐指数
3
解决办法
1242
查看次数

Haskell中的OO-Like接口实现

尽管标题我不会问OO世界和Haskell之间的翻译,但我无法找到更好的标题.这个讨论是类似的,但不等于,到这一个.

我开始了一个玩具项目,只是为了扩展我对Haskell的有限知识,同时阅读"为了一个伟大的好事学习你的哈斯克尔",我决定实施一个非常基本的"元素类型系统",它是一个子集. Final Fantasy et simila等游戏中的典型战斗系统.我正在跳过大部分细节,但这简直就是我的问题:

我想建模一个咒语,一个你可以施放在玩家或怪物身上的魔法.在OO世界中,你通常使用方法"onCast(Player)",一个"Spell"类进入"Castable"界面,这样你就可以定义这样的东西

Spell myNewSpell = Spell("Fire", 100, 20);
myNewSpell.onCast(Player p); //models the behaviour for the Fire spell
Run Code Online (Sandbox Code Playgroud)

在Haskell中,我根据类型和类来思考(我知道Haskell中的类是一个不同的概念!).我遇到了一些困难,因为我的第一次尝试是创造这个:

--A type synonim, a tuple (HP,MP)
type CastResult = (Integer,Integer)


--A castable spell can either deal damage (or restore) or
--inflict a status
class Castable s where
  onCast :: s -> Either (Maybe Status) CastResult


data Spell = Spell{spellName :: String,
                   spellCost :: Integer,
                   spellHpDmg :: Integer,
                   spellMpDmg :: Integer,
                   spellElem :: Maybe Element} deriving …
Run Code Online (Sandbox Code Playgroud)

haskell types interface

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

模板Haskell:如何提取函数的参数个数?

我有一个函数给出了Name一个函数它增加它,产生另一个函数应用于其他一些东西(细节不太相关):

mkSimple :: Name -> Int -> Q [Dec]
mkSimple adapteeName argsNum = do
  adapterName <- newName ("sfml" ++ (capitalize . nameBase $ adapteeName))
  adapteeFn <- varE adapteeName
  let args = mkArgs argsNum
  let wrapper = mkApply adapteeFn (map VarE args)
  -- generates something like SFML $ liftIO $ ((f a) b) c)
  fnBody <- [| SFML $ liftIO $ $(return wrapper) |]
  return [FunD adapterName [Clause (map VarP args) (NormalB fnBody) []]]

  where
    mkArgs :: Int -> …
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

9
推荐指数
1
解决办法
538
查看次数

我如何使用Swank和SLIME评估Emacs中的缓冲区和/或指令?

我在Emacs中成功安装了clojure-mode,slime,slime-repl.我用"lein swank"启动一个swank服务器并用"slime-connect"挂起粘液.我可以使用SLIME REPL来评估REPL中的Clojure表达式.

我如何评估单个s-exp或整个文件(我想运行带有Emacs的Clojure文件,并在专用框架或repl中查看输出),在SLIME REPL中显示答案?

例如,我在项目目录中的.clj文件中定义了一个简单的绑定:

(def my-bind [1 2 3])
Run Code Online (Sandbox Code Playgroud)

现在我希望SLIME在repl中评估这个表达式,所以如果在repl中我写:

(first my-bind)
Run Code Online (Sandbox Code Playgroud)

我想获得1.我该怎么办?

emacs clojure swank

8
推荐指数
2
解决办法
2390
查看次数

具有记录和类类型的 Haskell 多态函数

这个帖子是这个帖子的后续

我正在将一个简单的战斗系统实现为玩具项目,这是您可以在《最终幻想》等游戏中找到的典型系统。我已经用类类型 + 自定义实例解决了臭名昭著的“命名空间污染”问题。例如:

type HitPoints = Integer
type ManaPoints = Integer

data Status = Sleep | Poison | .. --Omitted
data Element = Fire | ... --Omitted

class Targetable a where
    name :: a -> String
    level :: a -> Int
    hp :: a -> HitPoints
    mp :: a -> ManaPoints
    status :: a -> Maybe [Status]

data Monster = Monster{monsterName :: String,
                       monsterLevel :: Int,
                       monsterHp :: HitPoints,
                       monsterMp :: ManaPoints,
                       monsterElemType :: Maybe Element,
                       monsterStatus :: …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell records

5
推荐指数
1
解决办法
1262
查看次数

VimL:如何只对视觉选择执行一次功能

我需要你的帮助.假设我有一个功能:

fun! Foo()
    " Do awesome staff
endfunction
Run Code Online (Sandbox Code Playgroud)

以及我的插件中的以下键绑定:

vnoremap <LocalLeader>cv :call Foo()<RETURN>
Run Code Online (Sandbox Code Playgroud)

我的问题是Foo()会调用我的视觉选择的每一行.相反,我只想让Foo()执行一次而且只执行一次.

有任何想法吗?

提前致谢.

vim

4
推荐指数
1
解决办法
1386
查看次数