好的,所以这是一个不寻常的.每当你看到Haskell的记录语法的例子时,它总是看起来像
Sphere {center = 0, radius = 2}
Run Code Online (Sandbox Code Playgroud)
或类似的.我的问题是......那些大括号实际上是记录语法的一部分吗?或者它们实际上是布局的简写?换句话说,你真的能写出像
Sphere
center = 0
radius = 2
Run Code Online (Sandbox Code Playgroud)
它有用吗?
我怀疑这样做会非常有用 - 它占用了大量的视觉空间 - 但我只是好奇这是否在语法上有效.
给定(严格)ByteString,计算它包含的每个可能字节的数量的最有效方法是什么?
我认为这sort应该被实现为计数排序 - 但似乎没有办法访问相关的计数.我还看到有一个count函数,它计算给定字节出现的次数.这给了我以下选项:
map (\ b -> count b str) [0x00 .. 0xFF]map length . group . sortfold*和IntMap字节频率.哪个可能会给我最好的表现?
我已经好几次这样做了,它似乎永远不会正常工作.有谁能解释为什么?
function Foobar
{
cmd -opt1 -opt2 $@
}
Run Code Online (Sandbox Code Playgroud)
这是什么应该做的是让这个电话Foobar做同样的事情与调用cmd,但有一些额外的参数(-opt1和-opt2,在这个例子中).
不幸的是,这不能正常工作.如果所有参数都缺少空格,它就可以了.但是如果你想要一个带空格的参数,你可以用引号写出来,而Bash有助于剥离引号,打破命令.如何防止这种错误行为?
我正在看另一个问题,最高评价的答案说:
其他答案已经提到了RAII,这是一个很好的答案.但是,最好的建议是:首先不要分配动态对象!别写了
Foo * x = new Foo();什么时候你可以写
Foo x;代替.
这对我来说似乎是个好听的建议.基于堆栈的东西已经具有良好且良好的自动生命周期管理.
我的问题是:如何将这个声音建议应用于类似的东西
char * buffer = new char[1024];
stream.read(buffer, 1024);
...do stuff...
delete[] buffer;
Run Code Online (Sandbox Code Playgroud)
如果我是愚蠢的应用,但你如何创建阵列而不使用new[]?
在以下程序中,Fibonacci数是从给定的整数(随机生成)生成的,并且该值存储在TVar中.由于生成Fibonacci的执行时间因不同的数量而不同,因此线程不会按顺序运行.我想存储theadID,可能在列表中,检查它们的执行模式. 请帮我.提前致谢.
module Main
where
import Control.Parallel
import Control.Concurrent.STM
import Control.Concurrent
import System.Random
import Control.Monad
import Data.IORef
import System.IO
nfib :: Int -> Int
nfib n | n <= 2 = 1
| otherwise = par n1 (pseq n2 (n1 + n2 ))
where n1 = nfib (n-1)
n2 = nfib (n-2)
type TInt = TVar Int
updateNum :: TInt -> Int -> STM()
updateNum n v = do x1 <- readTVar n
let y = nfib v
x2 …Run Code Online (Sandbox Code Playgroud) 当您编写Happy描述时,您必须定义可能出现的所有可能类型的令牌.但是你只能匹配令牌类型,而不是单个令牌值 ......
这有点问题.例如,考虑data关键字.根据Haskell报告,这个标记是"保留".所以我的tokeniser识别它并标记它.但是,请考虑as关键字.现在事实证明这不是一个保留; 这是一个普通的varid.它只在一个上下文中特殊.你可以完全声明一个名为的普通变量as,它很好.
所以这是一个问题:我如何as具体解析?
最初我并没有真正考虑过它.我刚刚定义了一个新的令牌类型,它表示任何文本恰好是的varid令牌as.
...然后我花了大约2个小时试图弄清楚为什么我的语法实际上不起作用.是的,事实证明,由于此令牌类型与现有令牌类型重叠,因此声明顺序非常重要.(!!!)从字面上看,改变声明的顺序使得语法完美解析.
但现在我很担心.我担心as永远不会匹配varid,只能匹配自己.所以说varid将拒绝as令牌的所有语法规则- 这是完全错误的!
解决这个问题的正确方法是什么?
我正在尝试在 Elm 中制作 CSS 动画,但我无法让它工作!
Elm 有几个动画包。我尝试使用的一个是mdgriffith/elm-animator. 遗憾的是,像许多 Elm 包一样,它的文档很少。它似乎提供了两种渲染方式:一种是通过运行 Elm 事件循环来对每一帧进行 DOM 更新,另一种是使用 CSS 动画 [我什至没有意识到它存在]。我正在尝试做后者。
我试图将代码缩小到一个最小的例子:
module Main exposing (main)
import Time
import Platform.Cmd
import Browser
import Html
import Html.Attributes
import Html.Events
import Color
import Svg
import Svg.Attributes
import Animator
import Animator.Css
main =
Browser.document
{
init = \ () -> ({fill = Animator.init <| Color.rgb 1 0 0}, Platform.Cmd.none),
subscriptions = \ state -> Animator.toSubscription Tick state animator,
view = \ state -> …Run Code Online (Sandbox Code Playgroud) 我发现自己在写这个:
and_then :: x -> Maybe [x] -> Maybe [x]
x `and_then` mxs = do
xs <- mxs
return (x:xs)
Run Code Online (Sandbox Code Playgroud)
是否有一些更简单的方法来实现同样的事情?
基本上这是处理列表的标准递归循环 - 除了处理可能失败(这与结果只是一个空列表不同).这意味着我通常写的地方
z : process xs ys
Run Code Online (Sandbox Code Playgroud)
我现在要写
z `and_then` process xs ys
Run Code Online (Sandbox Code Playgroud)
由于这是一个相当普遍的习语,我想知道一些预先存在的功能是否可以帮助我.(几个Hoogle搜索未能找到类似于上述类型的任何函数.)
我有一段时间没有访问过haskell.org.当我前几天做的时候,我发现一家名为FPComplete的公司已经开始提供一些相当有趣的Haskell服务.但是,在任何地方似乎都没有太多的文档,我有点困惑......
如果您通过"前门"进入,则需要先创建用户帐户,然后才能执行任何操作.但有时你可以点击示例代码并立即开始编辑和运行它 - 似乎不需要任何类型的帐户.那么是否需要帐户?有什么方法我可以尝试一下,而不会遇到设置帐户的麻烦吗?
另外,如果我"启动项目",默认情况下是公开的,还是私有的?如果我关闭浏览器窗口,它会消失吗?还是永远存在?如果我实际上不再需要该项目,我可以以某种方式删除它吗?
我对"FP Haskell中心"和"Haskell学校"之间的区别感到有些困惑......