虽然我知道GHC 中有一个TypeSynonymInstances扩展,我不知道它是多么"危险",我想知道这种限制是否是任意的,有点像单态限制,或者是否有更深层次的原因.
作为一名数学学生,我在Haskell学习monads时所做的第一件事就是检查它们是否真的是我知道的monad.但后来我了解了monad变换器,而那些似乎并不是类别理论研究的东西.
特别是我希望它们与分配法有关,但它们似乎真正不同:monad变换器预计适用于任意monad,而分配法则是monad和特定其他monad之间的事情.
另外,在看单子变压器的通常实施例中,而MaybeT m构成m与Maybe,StateT m不是的组合物m与State任一次序.
所以我的问题是什么是分类语言中的monad变换器?
这可能现在有点模糊,但我一直在想这一段时间.据我所知!,可以确保在构造值之前评估数据构造函数的参数:
data Foo = Bar !Int !Float
Run Code Online (Sandbox Code Playgroud)
我经常认为懒惰是一件好事.现在,当我浏览消息来源时,我会看到比非!变体更严格的字段.
这有什么好处,为什么我不应该把它保持懒惰呢?
未装箱的类型,比如Int#,和严格的功能,f (!x) = ...是不同的,但我看到概念上的相似性 - 他们在某种程度上不允许暴力/懒惰.如果Haskell是像Ocaml这样的严格语言,那么每个函数都是严格的,并且每个类型都是未装箱的.unboxed类型与强制执行之间的关系是什么?
我不确定这是不是很好的编程实践,但我想知道是否可以使用lambda表达式定义递归函数.
这是我编写的一个人为例子:因此可以递归地定义Haskell中的阶乘函数,如下所示
factorial :: Integer -> Integer
factorial 1 = 1
factorial (n + 1) = (n + 1) * factorial n
Run Code Online (Sandbox Code Playgroud)
现在,我想要一个f这样的功能f n = (factorial n) + 1.factorial n我想要定义f在定义中factorial n给出lambda表达式的位置,而不是使用名称(即,事先定义它)f.我可以使用递归lambda定义f代替使用名称factorial吗?
我正在尝试使用Haskell和Thrift做一个简单的Ping Pong.但是,它只会重复一次,然后就会卡住.我假设问题出在正确使用Thrift而不是Haskell中.可能没有正确刷新的东西.是否有任何有Thrift经验的人可以帮助我做出有关如何解决这个问题的有根据的猜测?
服务器:
echorequest :: TXT
echorequest = TXT {
f_TXT_anytxt = Just "Ping"
}
echoreply :: TXT
echoreply = TXT {
f_TXT_anytxt = Just "Pong"
}
serverFunc :: a -> (BinaryProtocol Handle, BinaryProtocol Handle)
-> IO Bool
serverFunc a (h1,h2) = do
let t1 = getTransport h1
dat <- read_TXT h1
-- the following two lines are only for debugging
putStrLn "Recieved data:"
print dat
write_TXT h1 echoreply
tFlush t1
-- the following line is for debugging
putStrLn "Data …Run Code Online (Sandbox Code Playgroud) 我注意到当我使用期望其他函数作为参数的函数时,我有时可以这样做:
someFunction(firstParam,anotherFunction)
Run Code Online (Sandbox Code Playgroud)
但其他时候,编译器给我一个错误,告诉我应该编写一个这样的函数,以便将它视为部分应用的函数:
someFunction(firstParam,anotherFunction _)
Run Code Online (Sandbox Code Playgroud)
例如,如果我有这个:
object Whatever {
def meth1(params:Array[Int]) = ...
def meth2(params:Array[Int]) = ...
}
import Whatever._
val callbacks = Array(meth1 _,meth2 _)
Run Code Online (Sandbox Code Playgroud)
为什么我不能拥有如下代码:
val callbacks = Array(meth1,meth2)
Run Code Online (Sandbox Code Playgroud)
在什么情况下编译器会告诉我添加_?
连续传递样式(cps)和monad之间有什么区别.
我定义我自己的版本concat,myConcat:
module Eh where
myConcat [] = []
myConcat ([]:os) = myConcat os
myConcat ((x:xs):os) = x : myConcat (xs:os)
(!!!) :: [a] -> Int -> a
xs !!! n | n < 0 = error "negative index"
[] !!! _ = error "index too large"
(x:_) !!! 0 = x
(_:xs) !!! n = xs !!! (n-1)
Run Code Online (Sandbox Code Playgroud)
如果我myConcat <some huge list> !! n使用GHC解释器,它会以300MB/s的速度窃取我的内存,而且我必须在它召唤OOM杀手之前杀死它.请注意,我加载Eh为"解释",我在加载之前不编译它.
code run in the GHC interpreter space leak? …
当我尝试用cabal安装它时,我明白了
~$ cabal install ghc-mod
Resolving dependencies...
[1 of 1] Compiling Main ( /tmp/haskell-src-exts-1.13.5-21238/haskell-src-exts-1.13.5/Setup.hs, /tmp/haskell-src-exts-1.13.5-21238/haskell-src-exts-1.13.5/dist/setup/Main.o )
/tmp/haskell-src-exts-1.13.5-21238/haskell-src-exts-1.13.5/Setup.hs:1:1:
Warning: In the use of `runTests'
(imported from Distribution.Simple, but defined in Distribution.Simple.UserHooks):
Deprecated: "Please use the new testing interface instead!"
Linking /tmp/haskell-src-exts-1.13.5-21238/haskell-src-exts-1.13.5/dist/setup/setup ...
Configuring haskell-src-exts-1.13.5...
Building haskell-src-exts-1.13.5...
Preprocessing library haskell-src-exts-1.13.5...
dist/build/Language/Haskell/Exts/InternalParser.hs:1:12:
Warning: -fglasgow-exts is deprecated: Use individual extensions instead
[ 1 of 22] Compiling Language.Haskell.Exts.Annotated.Syntax ( src/Language/Haskell/Exts/Annotated/Syntax.hs, dist/build/Language/Haskell/Exts/Annotated/Syntax.o )
cabal: Error: some packages failed to install:
ghc-mod-1.11.1 depends on haskell-src-exts-1.13.5 which failed …Run Code Online (Sandbox Code Playgroud)