2015-10-27 118 views
7

在代碼中定義的函數,有一個奇怪的「模式匹配」 (cradleRootDir -> projdir)模式匹配在Haskell

我想這是爲了應用功能內嵌並綁定結果的名稱projdir

該構造的名稱是什麼?

withGhcModEnv' :: (IOish m, GmOut m) => (FilePath -> (Cradle -> m a) -> m a) -> FilePath -> Options -> ((GhcModEnv, GhcModLog) -> m a) -> m a 
withGhcModEnv' withCradle dir opts f = 
    withCradle dir $ \crdl -> 
     withCradleRootDir crdl $ 
     f (GhcModEnv opts crdl, undefined) 
where 
    withCradleRootDir (cradleRootDir -> projdir) a = do 
     cdir <- liftIO $ getCurrentDirectory 
     eq <- liftIO $ pathsEqual projdir cdir 
     if not eq 
      then throw $ GMEWrongWorkingDirectory projdir cdir 
      else a 

data Cradle = Cradle { 
    cradleCurrentDir :: FilePath 
    , cradleRootDir :: FilePath 
    , cradleCabalFile :: Maybe FilePath 
    , cradlePkgDbStack :: [GhcPkgDb] 
    } deriving (Eq, Show) 
+3

這是一個視圖模式。查看[這個問題](http://stackoverflow.com/q/20766841/2751851)瞭解一些有趣的例子。 – duplode

回答

7

它使用View Patterns

評價爲了對一個圖案匹配一個值v的構造(表達式 - > PAT), 評估(表達式V)和相匹配的導致反對輕拍。

參見cabal file

Default-Extensions: ScopedTypeVariables, RecordWildCards, NamedFieldPuns, 
         ConstraintKinds, FlexibleContexts, 
         DataKinds, KindSignatures, TypeOperators, ViewPatterns 
                   ^^^^^^^^^^^^ 
                   | | | | |