Haskell:模式中的解析错误:acc

时间:2015-01-15 16:02:21

标签: haskell parse-error

我发现了一些Cloud Haskell演示版,我尝试运行它,但是我收到错误而且我不知道为什么。错误如下:

MasterSlave.hs:18:9:模式中的解析错误:acc

MasterSlave.hs的代码是:

module MasterSlave where

import Control.Monad
import Control.Distributed.Process
import Control.Distributed.Process.Closure
import PrimeFactors

slave :: (ProcessId, Integer) -> Process ()
slave (pid, n) = send pid (numPrimeFactors n)

remotable ['slave]

-- | Wait for n integers and sum them all up
sumIntegers :: Int -> Process Integer
sumIntegers = go 0
  where
    go :: Integer -> Int -> Process Integer
    go !acc 0 = return acc
    go !acc n = do
      m <- expect
      go (acc + m) (n - 1)

data SpawnStrategy = SpawnSyncWithReconnect
                   | SpawnSyncNoReconnect
                   | SpawnAsync
  deriving (Show, Read)

master :: Integer -> SpawnStrategy -> [NodeId] -> Process Integer
master n spawnStrategy slaves = do
  us <- getSelfPid

  -- Distribute 1 .. n amongst the slave processes
  spawnLocal $ case spawnStrategy of
    SpawnSyncWithReconnect ->
      forM_ (zip [1 .. n] (cycle slaves)) $ \(m, there) -> do
        them <- spawn there ($(mkClosure 'slave) (us, m))
        reconnect them
    SpawnSyncNoReconnect ->
      forM_ (zip [1 .. n] (cycle slaves)) $ \(m, there) -> do
        _them <- spawn there ($(mkClosure 'slave) (us, m))
        return ()
    SpawnAsync ->
      forM_ (zip [1 .. n] (cycle slaves)) $ \(m, there) -> do
        spawnAsync there ($(mkClosure 'slave) (us, m))
        _ <- expectTimeout 0 :: Process (Maybe DidSpawn)
        return ()

  -- Wait for the result
  sumIntegers (fromIntegral n)

此代码有什么问题?

1 个答案:

答案 0 :(得分:4)

您需要启用两种语言版本,BangPatternsTemplateHaskell。这些可以通过两种方式启用:

  1. 编译时从命令行
  2. 在源文件中使用扩展名(首选)
  3. 要在命令行启用它们,请为您需要的每个扩展程序传递标记-XExtensionName,因此对于您的情况,您有ghc -XTemplateHaskell -XBangPatterns source_file_name.hs

    要在源代码中启用它们,请使用文件顶部的{-# LANGUAGE ExtensionName #-}编译指示:

    {-# LANGUAGE TemplateHaskell #-}
    {-# LANGUAGE BangPatterns #-}
    module MasterSlave where
    
    ...
    

    语言扩展是GHC Haskell的重要组成部分。有一些非常常见,它们出现在大多数现实世界的应用程序中,例如OverloadedStrings允许您使用TextBytestring String字面语法,{ {1}}对于许多较高级的库(如MultiParamTypeClasseslens)来说是必不可少的。其他常见的扩展包括mtlDerive*DeriveFunctor扩展程序,可让编译器获得的扩展程序不仅仅是标准DeriveFoldableEq,{ {1}}和co。

    在您的情况下,Show添加了在函数参数和数据类型字段中指定额外严格性的语法。这有助于减少隐性懒惰带来的问题,但如果您不小心,它也可以用于过于沉重的手。 Read为GHC内置的模板/宏语言启用了大量额外语法。库作者可以编写模板Haskell函数,这些函数接受数据类型,表达式,函数名称或其他构造,并构建不需要留给用户的样板代码,但不容易或简洁到否则。 BangPatterns库与Yesod Web框架一起使用它很多。