2011-05-02 3 views
4

전 하스켈의 멍청한 놈입니다. 몇 시간 동안 있었기 때문에 누군가가 나를 도울 수 있기를 바랬습니다. 나는 어리석은 무언가를하고 있다는 것을 알고 있습니다.예상 유형과 실제 유형을 일치시킬 수 없습니다.

프로그램은 사전 파일을 스캔하여 공백이 제거 된 문장 모음에 대한 모든 유효한 단어 순서를 결정합니다.

Ex. "insidewaysoften"은 "측면에서 자주", "내부에서 부드럽게"등으로 나눌 수 있습니다.

필자의 프로토 타입을 파이썬으로 작성 했으므로 (Java 구현과 마찬가지로) 잘 작동하지만 하스켈 구현과 나는 그것을 작동시킬 수 없습니다. 나는 다음과 같은 코드를 사용하여 언어와 GHC에 대해 저지른 범죄에 대해 미리 사과 :

import System.Environment 

main = do 
    [dictFilename,sentFilename] <- getArgs 
    dictFile <- readFile dictFilename 
    sentFile <- readFile sentFilename 

    mapM (\sentence -> solve "" "" sentence (words dictFile)) (words sentFile) 

solve prefix header [] dict = 
    if (header `elem` dict) 
    then return prefix ++ header 
    else return "" 

solve prefix header sent dict = do 
    let more = solve prefix (header ++ (take 1 sent)) (drop 1 sent) dict 

    if (header `elem` dict) 
    then return (solve (prefix ++ header ++ " ") "" sent dict) ++ more 
    else return more 
+0

그래서 무엇이 잘못 되었나요? 어떤 오류가 발생합니까? 어디에? – Gabe

+0

우연히 [이 질문]을 쓴 MeeksMan13과 같은 과정을 택하고 있습니까 (http://stackoverflow.com/questions/5852841/splitting-a-sentence-without-any-whitespace-seperators-into-a-sentence -와 - 흰색)? 또한 예, 오류가 발생합니까 아니면 올바르게 작동하지 않는 것입니까? 그렇다면 어떤 방법으로 실패할까요? –

+0

예, Jeffrey, MeeksMan13과 같은 코스에있는 것처럼 보입니다. 나는 내 질문을 올린 직후 그의 질문을 보았다. 제가 게시 한 코드는 Rotors와 같은 유형 오류를 자신의 게시물에서 보여주었습니다. 나는 그가 제공 한 정보를 바탕으로 잘 될 것이라고 생각합니다. – dpiers

답변

9

유형의 오류를 조사하는 것은 당신이 알고있는 기능의 유형 서명을 작성하는 것입니다 가장 먼저하는 일. 여기

는 타입을 가질 수있다 해결

solve :: String -> String -> String -> [String] -> String 

또는 값을 계산하는 동안 어떠한 부작용을 가져야하는지 여부에 따라

solve :: String -> String -> String -> [String] -> IO String 

. mapMreturn을 사용하고있는 것을 보았을 때, IO 버전이 의도 된 것 같습니다.

이제 서명을 적어두면 훨씬 의미있는 오류 메시지가 나타납니다. 대신이의 예를 들면 다음과 같습니다 훨씬 이해가되지 않습니다

tmp.hs:19:16: 
    Couldn't match expected type `Char' with actual type `[Char]' 
    Expected type: [Char] 
     Actual type: [[Char]] 
    In the return type of a call of `solve' 
    In the first argument of `return', namely 
     `(solve (prefix ++ header ++ " ") "" sent dict)' 

는 당신이 얻을 : 문제가 정확히 표시

tmp.hs:14:8: 
    Couldn't match expected type `IO String' with actual type `[a0]' 
    In the expression: return prefix ++ header 
    In the expression: 
     if (header `elem` dict) then return prefix ++ header else return "" 
    In an equation for `solve': 
     solve prefix header [] dict 
      = if (header `elem` dict) then 
        return prefix ++ header 
      else 
       return "" 

을. 함수 응용 프로그램은 하스켈에서 최우선 순위이므로 return prefix ++ header(return prefix) ++ header과 같습니다.

그런데 반환 유형에서 IO을 제거한 경우 return을 모두 제거하고 putStrLn을 추가하여 호출을 변경하면 코드가 컴파일되고 작동합니다! 유일한 문제는 모든 가능한 문장을 어떤 구분없이 하나의 문자열로 연결한다는 것입니다.

+0

감사합니다. 이것은 정확히 제가 바라던 답변입니다. :) – dpiers

관련 문제