0
getPara :: (Num [Char])  =>  [Char] -> Integer -> [Char]
getPara "" _ = ""


getPara str nr 
    | (nr == 0 ) && ((head str) == ')' ) = ')' : getPara "" 0 
    | ( nr == 0 ) && ( (head str) == '(' ) = '(' : (getPara (tail str) 0)
    | (nr /= 0 ) && ( (head str) == '(') = (getPara (tail str) nr-1) 
    | (nr == 0 ) && ( (head str) /= '(' ) = (head str) : (getPara (tail str) 0 )
    | otherwise = (getPara (tail str) nr)

私がやろうとしているのは、文字列から括弧のnrセットを取得することであり、取得するエラーは次のとおりです。

Illegal Haskell 98 class constraint in type declaration
*** Expression : getPara
*** Type       : Num [Char] => [Char] -> Integer -> [Char]

何が問題ですか?

4

2 に答える 2

2

の型注釈getParaは許可されていませんが、根本的な問題は、定義のどこかに括弧がないことです。コードを次のように変更した場合:

getPara :: [Char] -> Integer -> [Char]
getPara "" _ = ""

getPara str nr 
    | (nr == 0 ) && ((head str) == ')' )  = ')' : getPara "" 0 
    | (nr == 0 ) && ( (head str) == '(' ) = '(' : (getPara (tail str) 0)
    | (nr /= 0 ) && ( (head str) == '(')  = (getPara (tail str) (nr-1))  -- here!
    | (nr == 0 ) && ( (head str) /= '(' ) = (head str) : (getPara (tail str) 0 )
    | otherwise = (getPara (tail str) nr)

コンパイルされます...しかし、それが機能するかどうかはわかりません。

2つの変更がありました:

  1. の型署名getPara
  2. nr-1括弧で囲みます

    | (nr /= 0 ) && ( (head str) == '(')  = (getPara (tail str) (nr-1))
    
于 2012-04-16T16:11:48.433 に答える
2

Mattの答えから始めて、コードを美化しましょう(ただし、機能するかどうかは確認していません)。まず第一に、リストのパターンマッチングは、多くのheadandよりもはるかに優れていtailます。

getPara :: [Char] -> Integer -> [Char]
getPara "" _ = ""
getPara (x:xs) nr 
    | (nr == 0 ) && ( x == ')' )  = ')' : getPara "" 0 
    | (nr == 0 ) && ( x == '(' ) = '(' : getPara xs 0
    | (nr /= 0 ) && ( x == '(' )  =  getPara xs (nr-1)  -- here!
    | (nr == 0 ) && ( x /= '(' ) = x : getPara xs 0 
    | otherwise = getPara xs nr

これで、さらに多くのパターンマッチングを行うことができます。

getPara :: [Char] -> Integer -> [Char]
getPara "" _ = ""
getPara (')':xs) 0                 = ')' : getPara "" 0 
getPara ('(':xs) 0                 = '(' : getPara xs 0
getPara ('(':xs) nr   | nr /= 0    = getPara xs (nr-1)  -- here!
getPara (x:xs) 0      | x /= '('   = x : getPara xs 0 
getPara (_:xs) nr                  = getPara xs nr

[編集]

ダニエルが指摘したように、注意深い分析は、残りの警備員が常に真実であることを明らかにするでしょう。

getPara :: [Char] -> Integer -> [Char]
getPara "" _ = ""
getPara (')':xs) 0   = ')' : getPara "" 0 
getPara ('(':xs) 0   = '(' : getPara xs 0
getPara ('(':xs) nr  = getPara xs (nr-1)  -- here!
getPara (x:xs) 0     = x : getPara xs 0 
getPara (_:xs) nr    = getPara xs nr
于 2012-04-16T17:55:51.040 に答える