我在Haskell工作的形式是在Haskell中爲了它的樂趣而重新工作.Net F#項目。爲什麼不是Haskell部分應用程序工作?
我正在解析一個常規的Windows配置文件 - 每行一個鍵/值對,鍵值從=
分隔。這個文件非常簡單直接,這使我的解析代碼變得簡單而直接,我喜歡。
我的問題是爲什麼部分應用程序不能在下面的最後一行代碼上工作。這顯然是在以前的線路和其他功能。
module Configuration (Config (..), load) where
import Data.Char (isSpace)
import Data.List (isPrefixOf)
data Config = Config { aliases :: [String]
, headers :: [String] }
-- This is a naive implementation. I can't decide if I like it better than
-- trim = unpack . strip . pack.
trim :: String -> String
trim = reverse . dropSpaces . reverse . dropSpaces
dropSpaces :: String -> String
dropSpaces = dropWhile isSpace
split _ [] = []
split c cs = [takeWhile (/= c) cs] ++ split c (tail' $ dropWhile (/= c) cs)
where tail' [] = []
tail' (x:xs) = xs
load :: String -> Config
load text =
let ss = lines text
hs = map getValue $ getLines "Header" ss
as = split ',' $ getValue $ getLine "AliasList" ss
in Config { aliases=as, headers=hs }
where getLines p = filter (p `isPrefixOf`)
getValue = trim . drop 1 . dropWhile (/= '=')
getLine = head . getLines -- Why isn't partial application working here?
錯誤我收到如下:
Configuration.hs:30:29:
Couldn't match expected type `[c0]'
with actual type `[[a0]] -> [[a0]]'
Expected type: [a0] -> [c0]
Actual type: [a0] -> [[a0]] -> [[a0]]
In the second argument of `(.)', namely `getLines'
In the expression: head . getLines
謝謝!
我想知道它是不是能夠將兩個參數傳遞給作爲函數組合的一部分的函數,但我無法通過簡單的Google搜索找到它。 –