2014-11-23 40 views
2

我有一個字符串列表,我想在下面的代碼列表的末尾添加一個字符串,但我收到類型匹配錯誤列表:哈斯克爾 - 如何將字符串到字符串

eliminateImpl :: [String] -> String -> [String] 
eliminateImpl [] _ = [] 
eliminateImpl (p:ps) r = if (contains (p:ps) "Impl") 
         then if (p == "Impl") 
           then "Not " ++r++" Or "++ps -- TRYING TO CONCATENATE HERE 
           else let r = r++p 
            in eliminateImpl ps r 
          else (p:ps) 

contains :: [String] -> String -> Bool 
contains [_] [] = True 
contains [] _ = False 
contains (p:ps) c = if p == c 
        then True 
        else contains ps c 

代碼的實際功能是函數eleminateImpl採用一階邏輯表達式,例如:「eliminationImpl [」Q(y)「,」Impl「,」P(x)「] []」和它應去除含義並修改表達式,以便輸出爲:「exceptImpl [」Not「,」Q(y)「,」Or「,」P(x)「]

我試過r ++ p和r:p但兩者都不起作用,這是錯誤:

Couldn't match type ‘Char’ with ‘[Char]’

Expected type: [String] 

    Actual type: [Char] 

In the first argument of ‘(++)’, namely ‘"Not "’ 

In the expression: "Not " ++ r ++ " Or " ++ ps 

In the expression: 

    if (p == "Impl") then 

     "Not " ++ r ++ " Or " ++ ps 

    else 

     let r = r ++ p in eliminateImpl ps r 

有沒有另一種方法呢?

+0

之後的字符串列表應該是什麼樣的? – 2014-11-23 17:27:17

+0

你能解釋一下你想做什麼嗎?我似乎無法理解你寫的內容。 – user2008934 2014-11-23 17:30:24

+0

@SebastianRedl函數應該得到一個一階邏輯表達式,例如:「eliminateImpl [」Q(y)「,」Impl「,」P(x)「] []」,函數應該刪除蘊含並修改表達式,以便輸出爲:「exceptImpl [」Not「,」Q(y)「,」Or「,」P(x)「]」 – SalmaFG 2014-11-23 17:30:39

回答

1

如果我理解正確的話,這似乎是接近你想要什麼:

EliminateImpl :: [String] -> [String] 
EliminateImpl [] = [] 
EliminateImpl [x] = [x] 
EliminateImpl (pred:impl:rest) str 
    | impl == "impl" = ("Not" : pred : "Or" : (EliminateImpl rest)) 
    | otherwise = (pred : (EliminateImpl (impl : rest))) 

如果我有誤解,請評論,我會改變我的答案。

只更換一個含義:

EliminateImpl :: [String] -> [String] 
EliminateImpl [] = [] 
EliminateImpl [x] = [x] 
EliminateImpl (pred:impl:rest) str 
    | impl == "impl" = ("Not" : pred : "Or" : rest) 
    | otherwise = (pred : (EliminateImpl (impl : rest))) 

這些功能應該通過字符串列表,直到他們找到的第一個"impl""impl"之前沒有任何更改。如果你想改變這種修改應該是微不足道的。

+0

是的邏輯是正確的。我只修復了一些小的語法問題,現在它完美地工作。我很困惑,但爲什麼在我自己的代碼中修改變量的附加後,我得到了一個stackoverflow問題,但這不是。 – SalmaFG 2014-11-23 18:05:24

+0

在特殊情況之後用單個'EliminateImpl xs = xs'情況替換兩個終止情況不是更容易嗎? – 2014-11-23 22:33:48

+0

@SebastianRedl - 可能,我只是不按順序思考,可能是因爲遞歸在命令式語言中的作用。 – user2008934 2014-11-23 22:40:06

1

類型註釋:

r :: String 
p :: String 
ps :: [String] 
-- We need to produce a [String], not a String 

(++) :: [a] -> [a] -> [a] 
(++) :: String -> String -> String -- Because String = [Char] 

(:) :: a -> [a] -> [a] 

"Not " ++ r ++ " Or " :: String 
("Not " ++ r ++ " Or ") : ps :: [String] 

這個過程應該引導您正確實施。仔細研究這些類型。我喜歡使用letwhere來寫入中間值的類型註釋;這樣,當表達式不具有我期望的類型時,我會得到一個真正特定的類型錯誤。

+0

我修正了它,但現在我得到了一個「錯誤 - C堆棧溢出」。任何想法爲什麼? – SalmaFG 2014-11-23 17:45:59

+0

另外r不是一個字符串,它也是一個[String]。但不知何故,這工作得很好。除了Stackoverflow錯誤。 – SalmaFG 2014-11-23 17:53:59

相關問題