小编Ele*_*fee的帖子

是否有一个Haskell等价的F#度量单位?

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上有一篇研究论文.我猜测实现整个过程不仅仅是几行代码.夏天项目有人吗?:)

f# haskell

15
推荐指数
2
解决办法
1486
查看次数

了解ES6符号

在语言方面,我一直在使用,从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对此采取不同的方法,我该如何解决它?

javascript symbols ecmascript-6

15
推荐指数
1
解决办法
543
查看次数

将错误调整为除外

现在已经Control.Monad.Error被弃用,并且Control.Monad.Except占据了至高无上的地位,很多在线资源都没有赶上,并且仍然展示了如何使用的例子Error.

那我该如何转向

instance Error MyError where
  noMsg  = ...
  strMsg = ...
Run Code Online (Sandbox Code Playgroud)

用什么东西Except.只是替换ErrorExcept没有按Except预期的其他类型参数工作

我知道那些确切的方法不存在Except,那么还有什么选择呢?

haskell exception-handling

14
推荐指数
1
解决办法
1283
查看次数

如何使用sbt创建自定义scala库?

就像在锡上说的那样,我将如何使用sbt创建一个库?

我有一组实用程序和便利功能,我希望在我的项目之间轻松分配.当然,最简单的方法是将它们编译到库中,然后我可以将其包含在任何给定项目的构建路径中.

与具有相同类的多个副本相比,在多个项目中包含库通常更容易.那我该怎么做呢?

scala sbt

12
推荐指数
1
解决办法
3013
查看次数

将非标量分配给标量有什么好处?

我有时会看到(对我而言)在变量前面使用错误符号的代码

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)

Q1:为此使用标量容器有什么好处,而不仅仅是使用“正确”的容器?

我知道的Perl只让收藏店标量,要求之类的多维数组通过数组引用来完成,以[...]{...}为数组和散列引用分别文字。

为了扩展和澄清我在这里的意思,基本上有两种定义事物的方法,通过值和通过引用:

my $arr …
Run Code Online (Sandbox Code Playgroud)

sigils raku

12
推荐指数
2
解决办法
229
查看次数

为什么在括号上使用花括号?

在很多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)
  • 因此,当它写在一行上时,是否有任何固有的理由使用一个而不是另一个?
  • 结果最终应该是一样的,还是我错过了什么?
  • 或者仅仅是风格和/或个人品味的问题?

scala language-design

11
推荐指数
1
解决办法
4674
查看次数

如何在ELisp中创建命名参数?

我认为既然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中这样做的正确方法是什么?

emacs elisp

11
推荐指数
3
解决办法
2401
查看次数

FRP如何处理内存?

阅读FRP(功能反应式编程)我很惊讶它与标准命令式方法相比有多么直观和合乎逻辑; 然而有一件事让我感到困惑..计算机怎么不立即耗尽内存呢?

根据我从[ 这里 ] 收集到的,在FRP中,价值变化的完整历史(过去,现在和未来)是一流的.这个概念立即在我脑海中响起一个警报,说如果它在一个没有立即从记忆中清除过去的值的环境中使用,它必须非常快地消耗你的记忆.

阅读[ Fran ],我注意到几个例子已经递归地定义了没有终止条件的函数.如果函数永远不会终止并将其值返回给调用它的函数,它将如何完成任何工作?或者就此而言,一段时间之后怎么没有吹掉堆栈呢?即使是像Haskell这样的惰性语言也会在某些时候遇到堆栈溢出.

对这些事情的解释将非常感激,因为它完全让我感到困惑.

haskell memory-management frp

11
推荐指数
1
解决办法
535
查看次数

Haskell的位置属性是什么?

现代CPU被优化,以便访问和修改存储器中的相同位置(时间局部性)以及存储器中的连续位置(空间局部性)是非常快速的操作.

现在,由于Haskell是一种纯粹的不可变语言,你自然不能覆盖现有的内存块,可能使得foldlfor具有连续访问的结果变量的循环慢得多的事情将在C中.

Haskell是否在内部做任何事情来减轻这种性能损失?一般来说,它的地方性质是什么?

memory performance haskell

11
推荐指数
2
解决办法
527
查看次数

无法将预期类型'Data.ByteString.Lazy.Internal.ByteString'与实际类型'[Char]'匹配

我试图在我的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 aeson

10
推荐指数
1
解决办法
3038
查看次数