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中比较字符和字符串的最佳(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)
但我不满意.有任何想法吗?再见,阿尔弗雷多
你如何设计和构建你的monadic堆栈?我第一次需要构建一个monadic堆栈(使用变换器)来解决现实问题,但我并不完全确定堆叠变换器的顺序.如你所知,只要计算有点* -> *
,基本上任何东西都可以在变换器中扮演内部monad的角色,因此有几个问题:
lift . lift . liftIO [...]
?我的直觉是,如果变形金刚得到一些实例(例如MonadReader,MonadIO等,就像大多数变形金刚mtl
一样),那么放置变压器的顺序并不重要.我有兴趣听取经验丰富的Haskellers关于最佳实践或经验法则的意见.
forever $ print "Thanks!"
一个.
我试图实现一些看似简单的东西,但我无法找到任何答案,无论是在谷歌还是在这里.我有一个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,按"搜索"并自动检索适当的交易.
我的Lisp工作环境将框架拆分为两个窗口,前者用于主编码,后者用于我的粘液评估.
不幸的是,当我犯了一些错误(因为我还在学习Lisp:P)时,粘液调试器警告我,并且这样做会显示在自动调整大小的底部窗口中.只是为了更明确:
之前:
_______
| |
| |
_______
|_____|
Run Code Online (Sandbox Code Playgroud)
后:
_______
| | <- decreased in size!
_______
|_____| <- increased in size!
Run Code Online (Sandbox Code Playgroud)
如何防止Emacs调整窗口大小?我希望Emacs让我的窗口大小相同.
我怎么能做到这一点?
谢谢!再见!
阿尔弗雷多
尽管标题我不会问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) 我有一个函数给出了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) 我在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.我该怎么办?
这个帖子是这个帖子的后续。
我正在将一个简单的战斗系统实现为玩具项目,这是您可以在《最终幻想》等游戏中找到的典型系统。我已经用类类型 + 自定义实例解决了臭名昭著的“命名空间污染”问题。例如:
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) 我需要你的帮助.假设我有一个功能:
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()执行一次而且只执行一次.
有任何想法吗?
提前致谢.