我是 Haskell 初学者,并选择它来解决我的班级的编程任务,但是我的解决方案太慢并且没有被接受。我正在尝试对其进行分析,并希望我可以从更高级的 Haskellers 那里得到一些指导。
到目前为止,我班上唯一被接受的其他解决方案是用 Rust 编写的。我确信我应该能够在 Haskell 中实现类似的性能,并且我编写了可怕的命令式代码以希望提高性能,可惜没有效果。
我的第一个怀疑与 相关work,我用来forever遍历入度数组,直到出现越界异常。我希望这是尾递归并编译为while (true)样式循环。
我的第二个怀疑是 I/O 可能会减慢速度。
编辑:这个问题可能与我的算法有关,因为我没有保留入度为 0 的节点队列。谢谢@luqui。
EDIT2:看来真正的瓶颈是 I/O,感谢@Davislor,我解决了这个问题。
该任务基于此: http: //www.spoj.com/UKCPLAD/problems/TOPOSORT/,我只能使用 Haskell 平台中的库。
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -O3 #-}
import Control.Monad
import Data.Array.IO
import Data.IORef
import Data.Int
import Control.Exception
type List = []
type Node = Int32
type Edge = (Node, Node)
type Indegree = Int32
main = do
(numNodes, _) <- readPair <$> …Run Code Online (Sandbox Code Playgroud) 是否可以在.ghci文件中添加注释?
例如
:set +r # https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#faq-and-things-to-watch-out-for
Run Code Online (Sandbox Code Playgroud)
这对于记录和切换行为都很有用.