我的代码经常使用看起来像的函数
foo :: (MyMonad m) => MyType a -> MyOtherType a -> ListT m a
Run Code Online (Sandbox Code Playgroud)
为了缩短这个,我编写了以下类型的别名:
type FooT m a = (MyMonad m) => ListT m a
Run Code Online (Sandbox Code Playgroud)
GHC让我打开Rank2Types(或RankNTypes),但是当我使用别名缩短我的代码时没有抱怨
foo :: MyType a -> MyOtherType a -> FooT m a
Run Code Online (Sandbox Code Playgroud)
相比之下,当我写另一种类型的别名
type Bar a b = (Something a, SomethingElse b) => NotAsBar a b
Run Code Online (Sandbox Code Playgroud)
并将其用于负面位置
bar :: Bar a b -> InsertTypeHere
Run Code Online (Sandbox Code Playgroud)
GHC大声喊叫我错了.
我想我已经知道发生了什么,但我相信我能从你的解释中更好地掌握,所以我有两个问题:
我一直无法找到matlab或octave中的函数来做我想做的事情.我有一个两列的矩阵m(x和y值).我知道我可以通过m(:,1)或m(:,2)来提取列.我想把它分成[可能]大小相等的较小的基质,并绘制这些基质的平均值.换句话说,我想根据x值将值放入bin中,然后找到bin的方法.我觉得hist函数应该对我有帮助,但似乎没有.
有没有人知道内置函数做这样的事情?
编辑
我本来打算提一下,我看了一下hist,无法让它做我想做的事,但它一定是我的想法.
示例:假设我有以下内容(我在八度音程中尝试此操作,但afaik在matlab中有效):
x=1:20;
y=[1:10,10:1];
m=[x, y];
Run Code Online (Sandbox Code Playgroud)
如果我想要10个箱子,我希望将其拆分为:
m1=[1:2, 1:2]
...
m5=[9:10, 9:10]
m6=[10:11, 10:-1:9]
...
m10=[19:20, 2:-1:1]
Run Code Online (Sandbox Code Playgroud)
然后得到每个bin的平均值.
更新:我在这里发布了一个后续问题.我非常感谢回复.
出于与Java的互操作性的目的,我需要一个具有执行初始化的nullary构造函数的类.这个类的对象需要有类似可变java字段的东西(即,对象代表游戏的后端,并且需要保持游戏状态).
deftype做我想做的一切,除了提供一个无效的构造函数(因为我正在创建一个带字段的类).
我不需要这些字段是公开可读的,所以我可以想到4个解决方案:
使用gen-class; 如果我能避免,我不想这样做.
以某种方式编码私有成员变量以外的deftype知识; 我被告知无法做到这一点.
编写一个修改过的deftype,它也创建了一个nullary构造函数; 坦率地说,我不太了解这种情况.
取deftype创建的类,并以某种方式添加一个新的构造函数.
最后,我需要一个Java类,因为我将把它交给Java代码,它将从类中创建一个新对象.
除了使用gen-class之外,我建议的任何解决方案(或任何我没有想过的解决方案)都可行吗?
假设我有4个模块:Common,A,B和Main,我想要以下模式:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Common
commonField Int
A
commonId CommonId
aField Int
B
commonId CommonId
bField Int
|]
Run Code Online (Sandbox Code Playgroud)
但是我希望将它分割为Common,A和B模块.然后,我希望Main依赖于所有这些并包含数据库逻辑.
我尝试了以下(忽略B)
-- module Common
share [mkPersist sqlSettings, mkMigrate "migrateCommon"] [persistLowerCase|
Common
commonField Int
|]
-- module A
share [mkPersist sqlSettings, mkMigrate "migrateA"] [persistLowerCase|
A
commonId CommonId
aField Int
|]
Run Code Online (Sandbox Code Playgroud)
但是由此产生的迁移将外部约束从A移除到Common.
我persistLowerCase在调用share之前尝试存储和连接quasiquoter 的结果,但这导致了一个关于CommonId不在范围内的类型错误.
我能想到的唯一其他解决方案是存储字符串,连接它们,并在其上调用quasiquoter,这似乎不太好.
有什么建议?
我在Haskell中玩这个代码kata,我在主题中遇到了问题.
找到索引是单个数值的数组的中点是微不足道的,但Haskell的数组索引可以是Ix类型类的任何实例,包括例如元组(Int,Word,Card),其中card是一个实例Ix但不是Num.
获取数组中点的一种方法是查询其长度,查询索引列表,并删除该列表的一半,但这需要O(n)时间.
有没有人知道如何在恒定时间内进行索引?我觉得应该有一个,因为Ix范围应该是一个整数范围.
arrays complexity-theory haskell functional-programming time-complexity
例如,尝试编译以下代码
{-# LANGUAGE StandaloneDeriving, KindSignatures, DataKinds, GADTs#-}
data ExprTag = Tag1 | Tag2
data Expr (tag :: ExprTag) where
Con1 :: Int -> Expr tag
Con2 :: Expr tag -> Expr tag
Con3 :: Expr tag -> Expr Tag2
deriving instance Eq (Expr a)
Run Code Online (Sandbox Code Playgroud)
给出了类型错误
Could not deduce (tag1 ~ tag)
from the context (a ~ 'Tag2)
bound by a pattern with constructor
Con3 :: forall (tag :: ExprTag). Expr tag -> Expr 'Tag2,
in an equation for `=='
at …Run Code Online (Sandbox Code Playgroud) 我有一组时间戳(每个时间戳对应于学生提交的内容),我想以图形方式查看它们。我知道criterion使用 KDE 并制作了一个漂亮的图,看起来它取决于statistics提供kde函数的包,但我无法跟踪代码criterion以查看它是如何使用的。
理想情况下,答案至少是生成图片的代码片段。criterion也欢迎对这种情况下的情况进行解释。
我有一个AWS实例.我想运行一堆任务,一些内存和CPU密集.理想情况下,我想计算每项任务的时间信息.如果我连续运行它们,它会计算准确的计时信息,但速度很慢.如果我并行运行它们,整个事情就会更快,但是单个任务的速度会更慢,正如壁时间和线程CPU时间所报告的那样.
随着线程数量增加到CPU数量,这种减速会增加
粗略检查ghc-events-analyze并+RTS -s暗示减速的来源(不出所料)GC暂停.使用RTS选项显示+RTS -qg -qb -qa -A256m(禁用并行GC,禁用负载平衡GC,禁用线程迁移以及增加GC分配区域)可以改善这一点,但并不能完全消除它.
我正在使用线程运行forkIO,但除了打印进度信息之外,线程是独立且纯粹的.我正在使用parallel-io来管理正在运行的线程的数量,但是当我简单地尝试一种更常规的方法来获得一个固定的线程池和一个任务队列时,我仍然遇到了这个问题.
有关如何调试的任何建议?
编辑:
@jberryman问了一个例子.每个任务看起来像下面的代码
computation params = do
!x <- force params
print $ "Starting computation on " ++ show params
t1 <- getCPUTime
!y <- fmap force $ do $
...some work with x ...
t2 <- getCPUTime
print $ "Finished computation on " ++ show params
return (t2 - t1, y)
Run Code Online (Sandbox Code Playgroud) parallel-processing multithreading garbage-collection haskell
我一直在尝试使用buildExpressionParser来解析一种语言,而我几乎拥有它.感谢Parsec.Expr重复的Prefix/Postfix运算符不支持解决我的一个大问题.
这段代码片段说明了(我希望是什么)我的最后一个难题:
import Text.Parsec.Expr
import Text.Parsec
data Expr = Lit Char | A1 Expr | A2 Expr | B Expr Expr
deriving (Show)
expr :: Parsec String () Expr
expr = buildExpressionParser table (fmap Lit digit)
prefix p = Prefix . chainl1 p $ return (.)
table =
[ [prefix $ char ',' >> return A1]
, [Infix (char '*' >> return B) AssocNone]
, [prefix $ char '.' >> return A2]]
Run Code Online (Sandbox Code Playgroud)
这成功地(并正确)解析,,0,..0,.,0 …