升级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) 为什么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) 我写了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 …
我写了这个但它无法编译
\n\nimport 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\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\ntest.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
我用守卫重写了它并且它起作用了。但我想知道为什么会这样。
\n我想在 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) 的限制比 [] 更高。谢谢
我想找出满足的第一个n .如果我使用其他语言(如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) 这就是我在做的事情:
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)
有没有办法把它们放在一行?
我有一个由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.
环境如下
汇编:
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) 传递给的闭包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) 编译器警告函数"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)