我正在使用将标识符作为字符串传递的Java API。对我来说,使用键入符号似乎更好一些,所以我写了这样的代码:
object Helpers {
implicit def actionToString(action: Action): String =
action.getClass.getName.stripSuffix("$").replaceAll(".*\\$", "")
object Action{
def apply(name: String): Action = {
Class.forName("tutorial.HelloInput$Helpers$" + name).newInstance()
.asInstanceOf[Action]
}
}
sealed abstract class Action {
override def toString: String = actionToString(this)
}
final case class Rotate() extends Action
final case class Right() extends Action
final case class Left() extends Action
final case class Pause() extends Action
}
Run Code Online (Sandbox Code Playgroud)
这允许以自然的方式对字符串和操作进行“序列化”和“反序列化”,例如,我可以在模式上进行匹配Action(Pause)
,但Pause()
由于隐式转换,我也可以传递给期望字符串的Java库。
有没有更好的方法可以做到这一点,特别是在性能方面?这种方法有什么问题,以后可能会再次咬我吗?
我在阅读有关Dotty中Phantom类型的内容,并想知道它们是否可用于提高处理符号的性能(或者新的Enums将是更好的选择)。
WartRemover NonUnitStatements
要求不返回单元的语句必须具有赋值。好的,但有时我们不得不使用烦人的 Java API,它们会发生变化并返回一个值,而实际上我们几乎从不关心返回值。
所以我最终尝试了这个:
val _ = mutateSomething(foo)
Run Code Online (Sandbox Code Playgroud)
但是,如果我有多个这些,_
实际上是已分配给的合法 val,因此我无法重新分配。Wartremover 也会正确地警告无缘无故的 var-usage,所以我不能只是这样做var _ =
。
我可以执行以下操作(需要;
避免 Scala 认为它是一个继续定义,除非我每次都添加一个完整的换行符)。
;{val _ = mutateSomething(foo)}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
所以,最终开始获得一个稳定的nix环境,我基本上可以完成我的所有开发.Hooray!
现在我想让它具有可重现性,如在yarn.lock中(对于那些熟悉javascript版本中的npm/yarn)或Pipfile.lock(非常类似于Python).
基本上我的想法是,无论何时运行nix-env -if my-env.nix
,或者在运行此命令之后,我都有办法生成类似的锁文件,如果它是如何工作的.从这个锁定文件,我可以完全恢复我的nix配置文件,直到确定的安装配置文件的依赖项和子依赖项的版本.在测试出新的改进之后,可以将其检入git或其他任何内容,因此将保持环境记录.
在我看来,这将是Nix最明显的使用案例之一,而且仅仅使用Docker的主要优势之一(尽管两者并不相互排斥),所以如果我错过了一些相关的文档,我会道歉.
特别是,我想用doCheck=true
.
作为起点,当我用我感兴趣的包尝试这个时(singularity
):
nix-build '<nixpkgs>' -E '(import <nixpkgs>{}).singularity'
Run Code Online (Sandbox Code Playgroud)
最终目标是这样的:
nix-build -E '(import <nixpkgs>{}).singularity.override { doCheck=true; }' --pure
Run Code Online (Sandbox Code Playgroud)
这两种情况都会导致错误消息:
error: expression does not evaluate to a derivation (or a set or list of those)
Run Code Online (Sandbox Code Playgroud)
当然,也许还有一种更简单的方法来启用checkPhase
,在这种情况下,我想这个问题可能有两个答案。
我最近向Maven Central发布了三个工件:https : //search.maven.org/search? q = ced2ar3- rdb
这三个是同一项目的一部分,并且同时发布。
我现在正在尝试使用ced2ar-rdb和ced2ar-rdb-tests作为依赖项来构建新项目,但没有在我的代码中引用父pom文件的位置(ced2ar3-rdb-parent;我实际上不想使用它,并且认为我不需要它)。但是,当我尝试构建使用ced2ar-rdb作为依赖项的项目时,出现以下错误:
[ERROR] Failed to execute goal on project ced2ar3-services-core: Could not resolve dependencies for project edu.cornell.
ncrn.ced2ar:ced2ar3-services-core:jar:0.0.0: Failed to collect dependencies at edu.cornell.ncrn.ced2ar:ced2ar3-rdb:jar:0
.0.1: Failed to read artifact descriptor for edu.cornell.ncrn.ced2ar:ced2ar3-rdb:jar:0.0.1: Could not find artifact edu.
cornell.ncrn.ced2ar:ced2ar3-rdb-parent:pom:${ced2ar.version} in central (https://repo.maven.apache.org/maven2) -> [Help
Run Code Online (Sandbox Code Playgroud)
该问题是否与我<version>${ced2ar.version}</version>
在父pom中拥有的事实有关,即使它在文件的更下方已经${ced2ar.version}
正确定义<properties>
了吗?
import Data.Char (chr, ord)
num2Str :: Int -> String
num2Str n | n < 26 = [num2Chr n]
num2Str n = num2Chr n : num2Str (n - 26)
where {
num2Chr :: Int -> Char;
num2Chr n = chr(97 + n `mod` 26)
}
Run Code Online (Sandbox Code Playgroud)
这导致错误
* Variable not in scope: num2Chr :: Int -> Char
* Perhaps you meant `num2Str' (line 132)
|
132 | num2Str n | n < 26 = [num2Chr n]
| ^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我尝试了一些替代布局,但似乎都没有.
次要更新
代码中存在一些与问题无关的逻辑错误; 这是一个更正版本: …
我正在设计一个需要跟踪不同类型表格的系统。拥有一个权威的表列表会非常方便*,并且拥有此列表的最佳方式 - 我认为 - 作为代理列表,因为有时我确实需要该类型。我认为 HLists 是一种选择,但即使在大量使用 Haskell 2 年后,它们看起来也很笨拙,所以我一直在寻找Dynamic
.
我的代码目前看起来像这样:
allCowProxies :: [Dynamic]
allCowProxies = [
toDyn $ Proxy @HoboRecord
, toDyn $ Proxy @AF.AfiFarmRecord
, toDyn $ Proxy @DCP.DcPrediction
, toDyn $ Proxy @DCF.DcFreshFeatures
, toDyn $ Proxy @DCH.DcHistorical
, toDyn $ Proxy @SA.ShActivity
, toDyn $ Proxy @SRE.ShRumAndEating
, toDyn $ Proxy @SX.SxRecord
]
allCowRecs :: [TypeRep]
allCowRecs = catMaybes $ toTypeRep <$> allCowProxies
where
toTypeRep d = case fromDynamic d of …
Run Code Online (Sandbox Code Playgroud) 我有一些代码如下,当所有在一行上,编译和功能正确:
let xsMat = makeArrayR U Seq(mapSize :. mapSize) (\(x :. y)
-> noiseValue perlinNoise(fromIntegral x, fromIntegral y, 0 ) )
Run Code Online (Sandbox Code Playgroud)
但我目前得到的错误是:
Main.hs:31:7: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
31 | -> noiseValue perlinNoise(fromIntegral x, fromIntegral y, 0 ) )
| ^
Run Code Online (Sandbox Code Playgroud)
我看到了Haskell Multi-line Lambdas,但也许我还缺少一些东西,或者这可能只是一个不同的问题.
我们也欢迎超出所需要的文体建议.
更新: @melpomene和Chris Smith的答案都解决了这个问题,值得一读(对于其他人来说)!对于风格改进,有人还建议使用$
我欣赏的,但他们的答案被删除(我认为因为核心问题没有得到解决 - 但也谢谢你):
let xsMat = makeArrayR U Seq(mapSize :. mapSize) $ \(x :. y)
-> noiseValue perlinNoise (fromIntegral x, fromIntegral y, 0 )
Run Code Online (Sandbox Code Playgroud) 我目前在这个项目中根本没有使用堆栈(只是 Cabal),当一切都在 Main.hs 中时,一切都很顺利。我决定拆分代码,将我的 dhall dep 和相关代码从我的可执行 deps 移动到我的库 deps,现在运行时似乎有这个奇怪的错误cabal new-build
:
Building executable 'FarmDataServer.exe' for FarmDataServer-0.1.0.0..
<no location info>: warning: [-Wmissing-home-modules]
These modules are needed for compilation but not listed in your .cabal file's other-modules: FDS
FDS.Config.Core
FDS.Config.DhallConf
[2 of 4] Compiling FDS.Config.DhallConf ( src/FDS/Config/DhallConf.hs, /home/brandon/workspace/CIDA/FarmDataServer/dist-newstyle/buil
d/x86_64-linux/ghc-8.4.4/FarmDataServer-0.1.0.0/x/FarmDataServer.exe/build/FarmDataServer.exe/FarmDataServer.exe-tmp/FDS/Config/Dhall
Conf.o )
src/FDS/Config/DhallConf.hs:7:1: error:
Could not find module `Dhall'
Use -v to see a list of the files searched for.
|
7 | import Dhall
| ^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
当然,我也对这条Wmissing-home-modules
消息有点困惑,因为我似乎已经在我的阴谋集团文件中添加了这些。
我的 …
这可能是一种构建方式
是否有(理想的标准)完成方式
f :: Int -> Int
f x = 2*x
g :: Int -> String
g x = show x
h = (f, g)
fmap h 5 -- results in: (10, "5")
Run Code Online (Sandbox Code Playgroud)
一般来说,对于从A-> T_i到某些变量类型T_i和固定类型A的函数,我认为这只是BiFunctor的简化,至少是2元组的1参数函数 - 它将是很高兴看到超越2元组的概括.