F#具有度量单位功能,如http://msdn.microsoft.com/en-us/library/dd233243.aspx所述,如下所示:
[<Measure>] type unit-name [ = measure ]
Run Code Online (Sandbox Code Playgroud)
这允许定义单位,例如:
type [<Measure>] USD
type [<Measure>] EUR
Run Code Online (Sandbox Code Playgroud)
代码写成:
let dollars = 25.0<USD>
let euros = 25.0<EUR>
// Results in an error as the units differ
if dollars > euros then printfn "Greater!"
Run Code Online (Sandbox Code Playgroud)
它还处理转换(我猜这意味着Measure定义了一些函数,让Measures成倍增加,分割和取幂):
// Mass, grams.
[<Measure>] type g
// Mass, kilograms.
[<Measure>] type kg
let gramsPerKilogram: float<g kg^-1> = 1000.0<g/kg>
let convertGramsToKilograms (x: float<g>) = x / gramsPerKilogram
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我应该可以在Haskell中实现类似的功能,但是我找不到任何如何做的例子.
编辑:哦,我的话,这是一个巨大的蠕虫!http://research.microsoft.com/en-us/um/people/akenn/units/CEFP09TypesForUnitsOfMeasure.pdf上有一篇研究论文.我猜测实现整个过程不仅仅是几行代码.夏天项目有人吗?:)
在语言方面,我一直在使用,从C#到Lisp,Scala到Haskell,以及支持它们的每种语言,符号几乎都是一样的.也就是说,任何两个具有相同名称的符号都保证是相同的,因为它们是单例对象.
球拍:(equal? 'foo 'foo)是的
Common Lisp:(eq 'foo 'foo)是的
Ruby::foo == :foo是的
斯卡拉:'foo == 'foo是的
ES6:Symbol('foo') === Symbol('foo') 错误
符号作为单例的好处是显而易见的:你可以在地图/字典中使用它们,而不会冒你的密钥不等于你的输入的风险,因为语言突然决定以不同的方式散列它(看着你,Ruby)
那么为什么ECMAScript 6对此采取不同的方法,我该如何解决它?
现在已经Control.Monad.Error被弃用,并且Control.Monad.Except占据了至高无上的地位,很多在线资源都没有赶上,并且仍然展示了如何使用的例子Error.
那我该如何转向
instance Error MyError where
noMsg = ...
strMsg = ...
Run Code Online (Sandbox Code Playgroud)
用什么东西Except.只是替换Error为Except没有按Except预期的其他类型参数工作
我知道那些确切的方法不存在Except,那么还有什么选择呢?
就像在锡上说的那样,我将如何使用sbt创建一个库?
我有一组实用程序和便利功能,我希望在我的项目之间轻松分配.当然,最简单的方法是将它们编译到库中,然后我可以将其包含在任何给定项目的构建路径中.
与具有相同类的多个副本相比,在多个项目中包含库通常更容易.那我该怎么做呢?
我有时会看到(对我而言)在变量前面使用错误符号的代码
my $arr = [1, 2, 3, 4, 5]; # an array
my $lst = (1, 2, 3, 4, 5); # a list
my $hash = {a => '1', b => '2'}; # a hash
my $func = -> $foo { say $foo }; # a callable
Run Code Online (Sandbox Code Playgroud)
这一切都完全按预期工作
say $arr[0]; # 1
say $lst[1]; # 2
say $hash<a>; # 1
say $hash{'b'}; # 2
$func('hello'); # hello
Run Code Online (Sandbox Code Playgroud)
我知道的Perl只让收藏店标量,要求之类的多维数组通过数组引用来完成,以[...]和{...}为数组和散列引用分别文字。
为了扩展和澄清我在这里的意思,基本上有两种定义事物的方法,通过值和通过引用:
my $arr …Run Code Online (Sandbox Code Playgroud) 在很多Scala示例中,我看到人们在我发现完全奇怪的地方使用花括号,当使用括号可以轻松地编写相同的语句时.
例:
lst foreach (x => println(s"the value returned is: $x")) // parens
lst foreach {x => println(s"you get the idea, $x")} // braces
Run Code Online (Sandbox Code Playgroud)
我知道你可以使用大括号作为括号的替代,只是因为它允许你在多行上写一个语句:
val res = for {
x <- coll1
y <- coll2
} yield (x, y)
Run Code Online (Sandbox Code Playgroud)
我认为既然Emacs Lisp和Common Lisp在语法方面看起来非常相似,我可以按照我在RosettaCode上找到的示例代码,但事实证明我错了.
有问题的代码如下所示:
(defun print-name (&key first (last "?"))
(princ last)
(when first
(princ ", ")
(princ first))
(values))
Run Code Online (Sandbox Code Playgroud)
根据RosettaCode,它应该执行以下操作:
> (print-name)
?
> (print-name :first "John")
?, John
> (print-name :last "Doe")
Doe
> (print-name :first "John" :last "Doe")
Doe, John
Run Code Online (Sandbox Code Playgroud)
现在,这就是事情; 每当我尝试在我的ELisp解释器中运行该函数时,我都会收到以下错误:
*** Eval error *** Wrong number of arguments: (lambda (&key first (last "?")) (princ la\
st) (if first (progn (princ ", ") (princ first))) (values)), 0
Run Code Online (Sandbox Code Playgroud)
我在lisp中没有足够的常规来知道这应该是什么意思,并且没有任何谷歌搜索让我更接近答案.
那么在Emacs Lisp中这样做的正确方法是什么?
阅读FRP(功能反应式编程)我很惊讶它与标准命令式方法相比有多么直观和合乎逻辑; 然而有一件事让我感到困惑..计算机怎么不立即耗尽内存呢?
根据我从[ 这里 ] 收集到的,在FRP中,价值变化的完整历史(过去,现在和未来)是一流的.这个概念立即在我脑海中响起一个警报,说如果它在一个没有立即从记忆中清除过去的值的环境中使用,它必须非常快地消耗你的记忆.
阅读[ Fran ],我注意到几个例子已经递归地定义了没有终止条件的函数.如果函数永远不会终止并将其值返回给调用它的函数,它将如何完成任何工作?或者就此而言,一段时间之后怎么没有吹掉堆栈呢?即使是像Haskell这样的惰性语言也会在某些时候遇到堆栈溢出.
对这些事情的解释将非常感激,因为它完全让我感到困惑.
现代CPU被优化,以便访问和修改存储器中的相同位置(时间局部性)以及存储器中的连续位置(空间局部性)是非常快速的操作.
现在,由于Haskell是一种纯粹的不可变语言,你自然不能覆盖现有的内存块,可能使得foldl比for具有连续访问的结果变量的循环慢得多的事情将在C中.
Haskell是否在内部做任何事情来减轻这种性能损失?一般来说,它的地方性质是什么?
我试图在我的Haskell代码中启动并运行一个简单的Json解析器,我遇到了Data.Aeson,它似乎是我问题的可行解决方案
{-#LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Text
import Control.Applicative
import Control.Monad
data Person =
Person { firstName :: Text
, lastName :: Text
, age :: Int
} deriving Show
instance FromJSON Person where
parseJSON (Object v) =
Person <$> v .: "f_name"
<*> v .: "l_name"
<*> v .: "age"
parseJSON _ = mzero
Run Code Online (Sandbox Code Playgroud)
在GHCi中运行以下内容会导致标题中出现令人讨厌的消息:
decode "{\"f_name\":\"Haskell\", \"l_name\":\"Curry\",\"age\":114}" :: Maybe Person
Run Code Online (Sandbox Code Playgroud)
那么,这里有没有人知道出了什么问题?我几乎完全按照编写的方式跟踪了示例代码,为什么它会失败呢?
haskell ×5
scala ×2
aeson ×1
ecmascript-6 ×1
elisp ×1
emacs ×1
f# ×1
frp ×1
javascript ×1
memory ×1
performance ×1
raku ×1
sbt ×1
sigils ×1
symbols ×1