小编eii*_*000的帖子

将平台从8.0.1升级到8.0.2后,堆栈无法正常工作

升级haskell平台包后,stack命令不起作用.

$ stack path
No compiler found, expected minor version match with ghc-8.0.1 (x86_64) (based on resolver setting in /home/eii/exercism/haskell/linked-list/stack.yaml).
To install the correct GHC into /home/eii/.stack/programs/x86_64-linux/, try running "stack setup" or use the "--install-ghc" flag.
$
Run Code Online (Sandbox Code Playgroud)

我尝试了堆栈设置,但它正在尝试下载旧的GHC(ghc-8.0.1).我刚刚安装了Haskell平台8.0.2(haskell-platform-8.0.2-unknown-posix-full-x86_64.tar.gz).我使用的是64位Linux.

$ stack setup
Preparing to install GHC to an isolated location.
This will not interfere with any system-level installation.
ghc-8.0.1:   15.69 MiB / 108.01 MiB ( 14.52%) downloaded...^Cuser interrupt
$
Run Code Online (Sandbox Code Playgroud)

我可以用ghc-8.0.2编译并且ghci工作正常..但我不能使用堆栈也不能安装新包.

$ stack update
Downloading package index from https://s3.amazonaws.com/hackage.fpcomplete.com/00-index.tar.gz
Updating package index …
Run Code Online (Sandbox Code Playgroud)

haskell-stack

7
推荐指数
1
解决办法
620
查看次数

foldl with(++)比foldr慢很多

为什么foldl有时比foldr慢?我有一个列表"a"之类的

a = [[1],[2],[3]]
Run Code Online (Sandbox Code Playgroud)

并希望使用fold将其更改为列表

foldr (++) [] a
Run Code Online (Sandbox Code Playgroud)

它工作正常(时间复杂度为O(n)).但是,如果我使用foldl,它非常慢(时间复杂度为O(n ^ 2)).

foldl (++) [] a
Run Code Online (Sandbox Code Playgroud)

如果foldl只是从左侧折叠输入列表,

(([] ++ [1]) ++ [2]) ++ [3]
Run Code Online (Sandbox Code Playgroud)

和折叠是从右侧,

[1] ++ ([2] ++ ([3] ++ []))
Run Code Online (Sandbox Code Playgroud)

在两种情况下,计算次数(++)应该相同.为什么折叠这么慢?根据时间复杂度,foldl看起来好像扫描输入列表的次数是foldr的两倍.我用下面的电脑来计算时间

length $ fold (++) [] $ map (:[]) [1..N]   (fold is either foldl or foldr)
Run Code Online (Sandbox Code Playgroud)

haskell

6
推荐指数
1
解决办法
240
查看次数

合并功能要慢得多

我写了isPrime函数.它检查给定的数字是否为素数.最后的"主要"列表是单独给出的.

prime :: [Integer]
prime = 2 : filter isPrime [3..]
isPrime :: Integer -> Bool
isPrime n | n < 2 = False
isPrime n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ prime
Run Code Online (Sandbox Code Playgroud)

我认为如果可能的话,将两个函数合并为一个总是更好.所以我将isPrime和prime合并到一个函数isPrime2中.但isPrime2的表现非常糟糕.

isPrime2 :: Integer -> Bool
isPrime2 n | n < 2 = False
isPrime2 n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ 2 : filter isPrime2 [3..]
Run Code Online (Sandbox Code Playgroud)

isPrime 40000000000000000001 …

performance primes haskell primality-test

6
推荐指数
1
解决办法
78
查看次数

为什么模式匹配不能共享 where 子句?

我写了这个但它无法编译

\n\n
import Data.Maybe\nfunc Nothing Nothing = func2 "hello" "world"\nfunc x       y       = func2 "hello" "world"\n  where func2 a b = a ++ b\nmain = print $ func Nothing Nothing\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
test.hs:2:24: error:\n    \xe2\x80\xa2 Variable not in scope: func2 :: [Char] -> [Char] -> [Char]\n    \xe2\x80\xa2 Perhaps you meant \xe2\x80\x98func\xe2\x80\x99 (line 2)\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

我用守卫重写了它并且它起作用了。但我想知道为什么会这样。

\n

syntax haskell scope pattern-matching

5
推荐指数
0
解决办法
461
查看次数

Javascript 中的最大数组大小是多少以及要使用哪些数组

我想在 Javascript 中创建一个大数组并编写了以下代码,但由于 OOM 而不起作用

let N = 125000000;
let numbers = [];
for (let i = 0; i < N; i++) {
    numbers[i] = Math.round(Math.random()*10000);
}
Run Code Online (Sandbox Code Playgroud)

然后我写了“让数字=新数组(N);” 相反,它适用于 N (125000000),但不适用于更大的 N (200000000)。然后我使用了 Uint32Array,它适用于更大的 N。它最多可达 N = 2^31-1。Javascript 中 []、new Array(size)、Uint32Array 的大小有限制吗?我猜 Uint32Array 的最大大小是 2^31-1。我还想知道为什么 new Array(N) 的限制比 [] 更高。谢谢

javascript node.js

5
推荐指数
1
解决办法
1747
查看次数

如何在Haskell中实现带有条件中断的循环

我想找出满足的第一个n F(N)=\sum_ {K = 1} ^ {N} {1 /(K*K + 2K)}> = 2.99/4.0.如果我使用其他语言(如c/c ++),这是一个简单易用的东西,但我不知道如何在Haskell中实现它.

#include <iostream>
long double term(int k) { return 1.0/(k*k+2.0*k); }
int main() {
    long double total = 0.0;
    for (int k=1;;k++) {
        total += term(k);
        if (total>=2.99/4.0) {
            std::cout << k << std::endl;
            break;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用了带有序列表的dropWhile,并选择1来获取第一个.

term k = 1.0/(k*k+2.0*k)
termSum n = sum $ take n $ map term [1..]
main = do
  let [(n,val)] = take 1 $ dropWhile (\(a,b)->b <= 2.99/4.0) $ map (\n->(n,termSum n)) [1..]
  print n …
Run Code Online (Sandbox Code Playgroud)

haskell

4
推荐指数
3
解决办法
180
查看次数

如何在飞行中使用IO monad输出

这就是我在做的事情:

data Person = Person (IORef String) (IORef Int)
name <- newIORef "Boston"
age <- newIORef 100
p = Person name age
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以将它们放在一行中,例如:

p = Person (newIORef "Boston") (newIORef (100::Int))
Run Code Online (Sandbox Code Playgroud)

有没有办法把它们放在一行?

monads haskell

2
推荐指数
1
解决办法
94
查看次数

无法写入(2)大于2GB的文件(最高2TB)

我有一个由C编写的程序.它计算一些东西并将输出写入文件.我的问题是它写的不超过2GB.让我把一个简化的代码.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <malloc.h>
#include <errno.h>
int main() {
    size_t size = 3221225472LL;
    char *map = malloc(size);
    size_t allocated = malloc_usable_size(map);
    int fd = open("myfile", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0644);
    ssize_t written = write(fd, map, size);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然正在创建输出文件"myfile",但是对于我请求的大小超过2GB的大小,大小总是2GB(2147479552字节).malloc()成功分配了所请求大小的内存(在这种情况下,"已分配"为3GB ).write()之后的errno为0.

环境如下

  • 操作系统:Ubuntu 16.04.1 x86_64
  • 物理内存大小:32GB
  • 文件系统:ext4

汇编:

gcc code.c -D_FILE_OFFSET_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因?

补充:收到两个回复后,我添加了重试代码如下:

int main() {
    size_t size = 3221225472LL;
    char *map = malloc(size);
    size_t allocated = malloc_usable_size(map);
    int …
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
740
查看次数

为什么传递给 map() 的闭包不接受引用,而传递给 filter() 的闭包接受引用?

传递给的闭包map()不接受引用,而传递给的闭包filter()在 Rust 中接受引用。大多数迭代器适配器都有一个参考。有什么理由map()不在 Rust 中引用吗?

let a = (0..3).map(|x| x*2);
for i in a {
    println!("map i = {}", i);
}

let a = (0..3).filter(|&x| x % 2 == 0);
for i in a {
    println!("filter i = {}", i);
}
Run Code Online (Sandbox Code Playgroud)

closures iterator reference ownership rust

2
推荐指数
1
解决办法
60
查看次数

为什么这个功能不详尽?

编译器警告函数"insert"在以下代码中并非详尽无遗:

data Set a = Empty | Set a (Set a) (Set a) deriving (Eq, Show)

insert :: (Ord a) => a -> Set a -> Set a
insert x Empty = Set x Empty Empty
insert x (Set v l r)
  | x <= v = Set v (insert x l) r
  | v < x  = Set v l (insert x r)
--  | otherwise = Set x Empty Empty

main :: IO ()
main = do
  let …
Run Code Online (Sandbox Code Playgroud)

haskell

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