我有一个用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) 我刚收到了专家F#2.0的副本并且发现了这个声明,这有点让我感到惊讶:
例如,在必要时,您可以对算法开头分配的私有数据结构使用副作用,然后在返回结果之前丢弃这些数据结构; 总体结果实际上是一种无副作用的功能.从F#库中分离的一个例子是List.map的库实现,它在内部使用变异; 写入发生在内部分离的数据结构上,其他代码无法访问.
现在,显然这种方法的优点是性能.我只是好奇是否有任何缺点 - 副作用带来的任何陷阱都适用于此吗?并行性是否受到影响?
换句话说,如果放弃表现,那么List.map以纯粹的方式实施会更好吗?
(显然这特别涉及F#,但我也对一般哲学感到好奇)
为了学习Haskell,我决定制作一个Minesweeper克隆。我已经编写了一些代码,程序的主要结构已经准备就绪。它基于:
Board,包含amount地雷的,地图fields的width以及height和的列表。Field,包含相邻地雷的数量或一个指示字段本身是地雷的值。该Field还含有FieldState(Marked,Hidden或Shown)。游戏循环如下所示:
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)