我发现使用Visual Studio开发了一个不愉快的行为.在编译C#时它挂起了我的机器.
我已经减少了对下一个最小源代码的行为
using System.Collections.Generic;
using System.Linq;
namespace memoryOverflowCsharpCompiler {
class SomeType { public decimal x; }
class TypeWrapper : Dictionary<int,
Dictionary<int,
Dictionary<int, SomeType [] []>>> {
public decimal minimumX() {
return base.Values.Min(a =>
a.Values.Min(b =>
b.Values.Min(c =>
c .Sum(d =>
d .Sum(e => e.x)))));
}
}
}
Run Code Online (Sandbox Code Playgroud)
用.编译
PROMPT> csc source.cs
*** BANG! overflow memory usage (up to ~3G)
PROMPT> csc /?
Microsoft (R) Visual C# Compiler version 12.0.30501.0
Copyright (C) Microsoft Corporation. All rights reserved.
...
Run Code Online (Sandbox Code Playgroud)
(使用Windows 8.1 …
MVar,TVar,IORef,...我无法加快一个thunk问题(我想).
(我原来的问题是一个线程代码,我做"forkIO"n次调用"addMany";但我认为我的问题是"shW"函数)
让下一个代码:
{-# LANGUAGE BangPatterns #-}
import Control.Concurrent
import Control.Monad
import System.Environment(getArgs)
import Data.Int
import Data.IORef
-- "i" times, add "n" for each IORef (in "a")
addMany :: [IORef Int64] -> Int64 -> Int64 -> IO ()
addMany !a !n !i =
forM_ [1..i] (\_ ->
forM_ a (shW n))
-- MVar, TVar, IORef, ... read/write (x' = x + k)
shR = readIORef
shW !k !r = atomicModifyIORef r (\ !x' -> (x' + k, ()))
main = …Run Code Online (Sandbox Code Playgroud) 我已经阅读过Haskell中的插件,但是我无法满足自己的目的(最好是在生产环境中使用).
我的插件系统目标是:
一个最小的例子可能是:
app/service~plugins界面
module SharedTypes (PluginInterface (..)) where
data PluginInterface =
PluginInterface { pluginName :: String
, runPlugin :: Int -> Int }
Run Code Online (Sandbox Code Playgroud)
一些插件列表
-- ~/plugins/plugin{Nth}.?? (with N=1..)
module Plugin{Nth}( getPlugin ) where
import SharedTypes
getPlugin :: PluginInterface
getPlugin = PluginInterface "{Nth}th plugin" $ \x -> {Nth} * x
Run Code Online (Sandbox Code Playgroud)
应用/服务
...
loadPlugins :: FilePath -> IO [PluginInterface]
loadPlugins = undefined
...
Run Code Online (Sandbox Code Playgroud)
我认为使用动态编译链接库(将每个编译Plugin{Nth}为共享库)可以工作(作为FFI)但是
getPlugin功能点)谢谢!
UPDATE
在伟大的@xnyhps回答之后,一个完整的运行示例使用 …
一年来,我一直是新秀哈斯克勒(我认为,"新秀哈斯克勒").我编写了很少的haskell程序(例如,一个非常简单的蛇游戏)但是当我必须使用某些库时,包依赖和ghc失败的版本对我来说很难.
我认为选择正确的ghc版本是一门艺术.
太新了,库也失败了(例如,yesod最近更新到7.4; grapefruit-ui-gtk目前失败了).
太旧了,库已经过时但尚未得到支持.
HackageDB及其开发者非常棒,但我觉得笨拙并且不知道开发严肃程序的正确方法.
我应该做什么?我是不是很缺乏经验?艰难的方式是唯一的方法吗?
(对不起,如果问题太笼统)
我希望运行我的并行程序
$ myprogram <args> -n 4 <args>
Run Code Online (Sandbox Code Playgroud)
代替
$ myprogram <args> +RTS -N4 -RTS <args>
Run Code Online (Sandbox Code Playgroud)
主要原因是规范我的程序的参数格式.
我知道它可以做到
$ myprogramwrapper <args> -n 4 <args>
$ cat myprogramwrapper
#!/bin/bash
ARG1=parse args
ARG2=...
NCORES=....
myprogram $ARG1 ... +RTS -N$NCORES
Run Code Online (Sandbox Code Playgroud)
但它很难看.
非常感谢!:)
对于非平凡的项目,通常将它分成几个包(特别是,我通常使用包含1-10个项目的Visual Studio C#解决方案).
我cabal clean && cabal configure && cabal install --force-reinstall每次修改另一个包中使用的包时,都会执行当前的Haskell工作流.
这样可以正常工作,但我希望能够使用几个Haskell项目,就好像只有一个(理想情况下是A和B项目被修改然后使用ghci A检测更改B).
如果某些包A(在开发中)在几个"工作空间"中共享,则建议的解决方案(如果可能)也应该正常工作.
我寻找,但独特的相关响应(Haskell Cafe,使用多个项目2009)建议我当前的工作流程作为解决方案.
任何解释它的教程(工作区,共享"开发"包,......)都将受到欢迎!
非常感谢!!!:)
(我正在努力ghc)
(通过标题道歉,我不能做得更好)
我的问题是找到一些通用的结构或"标准"函数来执行下一件事:
xmap :: (a -> b) -> f a -> g b
Run Code Online (Sandbox Code Playgroud)
那么,我们不仅可以映射元素,还可以映射整个结构.
一些(不是真实的)例子
xmap id myBinaryTree :: [a]
Run Code Online (Sandbox Code Playgroud)
此刻,我必须做一个明确的结构conversor(典型fromList,toList)然后
toList . fmap id -- if source struct has map
fmap id . fromList -- if destination struct has map
Run Code Online (Sandbox Code Playgroud)
(执行toStruct,fromStruct我使用fold).
存在某种推广to/ from结构的方式?(应该)存在函数(xmap)?
谢谢!!:)
让某些类型实例化为许多类.有选择地替换某些实例的行为的正确方法是什么?
表达它的一种方法可能是构造by运算符
data Person ...
sort personList -- default Ord instance
(sort `by` age) personList -- `age` modify `Ord` instance
Run Code Online (Sandbox Code Playgroud)
这里,sort可以是任何minimumarity(例如insert)的任何函数(例如).
如果我们有像这样的功能
reportPersons :: [Person] -> Report
Run Code Online (Sandbox Code Playgroud)
它的功能是使用Ord(排序列表),Show(格式化记录),......或其他特定实例; 使用funcBy模式我们必须写
reportPersonsBy :: (Person -> Person -> Ordering) -> (Person -> String) -> ... -> [Person] -> Report
Run Code Online (Sandbox Code Playgroud)
但是我们可以使用by原始的每个行为来包装reportPersons 而没有重构reportPersonsBy(解释示例并且最后没有解决相关问题).
我的玩具(并不完全令人满意)解决方案是(最后的完整代码):
将类型包装到类型中以覆盖实例的类
class Wrappable m where
wrap :: forall a . a -> …Run Code Online (Sandbox Code Playgroud) (我的问题是关于没有haskell-platform,ghc,cabal等的分发二进制文件)
我需要部署一个良好的cabal形成haskell应用程序(一个Yesod脚手架),但我有磁盘空间限制.
GHC大小约为1Gbytes,存储所有cabal源代码,包等...需要更多磁盘空间等...
显然,haskell-platform,ghc,...是关于开发(不是部署).
在我的具体情况下,我可以生成
cabal clean && cabal configure && cabal build
Run Code Online (Sandbox Code Playgroud)
并成功运行(有些像)
./dist/build/MyEntryPoint/MyEntryPoint arg arg arg
Run Code Online (Sandbox Code Playgroud)
但是,依赖关系呢?如何将其转移到生产环境?(连同我的"dist"汇编)
我可以在没有cabal的情况下放置二进制依赖项 怎么样?
非常感谢你!