相关疑难解决方法(0)

Python比编译Haskell更快?

我有一个用Python和Haskell编写的简单脚本.它读取一个包含1,000,000个换行符分隔整数的文件,将该文件解析为整数列表,对其进行快速排序,然后将其写入已排序的其他文件.此文件的格式与未排序的文件相同.简单.

这是Haskell:

quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs

main = do
    file <- readFile "data"
    let un = lines file
    let f = map (\x -> read x::Int ) un
    let done = quicksort f
    writeFile "sorted" (unlines (map show done))
Run Code Online (Sandbox Code Playgroud)

这是Python:

def qs(ar):
    if len(ar) == 0:
        return ar

    p …
Run Code Online (Sandbox Code Playgroud)

python haskell quicksort

44
推荐指数
4
解决办法
1万
查看次数

对调用者看起来纯粹但在内部使用突变的函数

我刚收到了专家F#2.0的副本并且发现了这个声明,这有点让我感到惊讶:

例如,在必要时,您可以对算法开头分配的私有数据结构使用副作用,然后在返回结果之前丢弃这些数据结构; 总体结果实际上是一种无副作用的功能.从F#库中分离的一个例子是List.map的库实现,它在内部使用变异; 写入发生在内部分离的数据结构上,其他代码无法访问.

现在,显然这种方法的优点是性能.我只是好奇是否有任何缺点 - 副作用带来的任何陷阱都适用于此吗?并行性是否受到影响?

换句话说,如果放弃表现,那么List.map以纯粹的方式实施会更好吗?

(显然这特别涉及F#,但我也对一般哲学感到好奇)

monads f# haskell functional-programming side-effects

8
推荐指数
3
解决办法
1343
查看次数

在Haskell的Minesweeper克隆中管理状态

为了学习Haskell,我决定制作一个Minesweeper克隆。我已经编写了一些代码,程序的主要结构已经准备就绪。它基于:

  • A Board,包含amount地雷的,地图fieldswidth以及height和的列表。
  • 一个Field,包含相邻地雷的数量或一个指示字段本身是地雷的值。该Field还含有FieldStateMarkedHiddenShown)。

游戏循环如下所示:

play board = do
    -- Clear the screen
    putStrLn $ replicate 40 '\n'

    -- Show the board
    print board

    -- Get and process user input
    putStr "Command: "
    -- We are generating a new board to reflect the changes!
    newBoard <- parseInput board <$> getLine

    -- If the game is not ended, go to …
Run Code Online (Sandbox Code Playgroud)

haskell

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