2014-11-16 1 views
0

String에 두 번 사용되는 함수가 필요합니다. 나는 내가 원하는 것을 설명 할 것이므로 질문의 끝에서 내가 의미하는 바를 얻을 수 있기를 바랍니다.지도를 두 번 사용하여 함수 사용

그래서이 기능이 있습니다.

foo :: String -> [String] 
foo = ... 

이제이 함수를 String에 두 번 사용하고 싶습니다. 따라서 처음 사용할 때는 함수에 주어진 String을 사용하여 foo를 실행해야하고 두 번째 실행에서는 첫 번째 실행에서 생성 된 [String]의 모든 String에 사용해야합니다. 그래서 나는 그지도가 최선의 기능이라고 생각했습니다. 그래서 나는 지금이 기능

f :: String -> [String] 
f w = map foo (foo w) 

있어하지만 compliler 날이 오류를 제공합니다

MyHaskell.hs:86:19: 
Couldn't match type `[Char]' with `Char' 
Expected type: String -> String 
    Actual type: String -> [String] 
In the first argument of `map', namely `edits1' 
In the expression: map edits1 (edits1 word) 

나는 문제가 내 함수 foo 것으로 추측 (문자열 -> [문자열]) 작동하지 않습니다를 지도 ((a-> b) -> [a] -> [b]).

어떻게 수정합니까?

답변

2

@ 대체가이 대답으로 나를 데려왔다.

나는 그 결과로 [String]을 얻을 수 있도록 결과를 concat해야합니다.

f :: String -> [String] 
f w = concat (map foo (foo w)) 
+2

이는'import Control.Monad;와 같습니다. f = foo> => foo'. – user3237465

+0

또한'concatMap foo와 동일합니다. foo'. –

+0

그리고'foo> => foo'보다 10 배나 더 읽기 쉽습니다. – alternative

2

매우 가까웠습니다.

f :: String -> [[String]] 
f w = map foo (foo w) 

당신은 단지 유형 서명 잘못을 가지고 - 각 요소에 foo을 적용하는 경우, 각 요소는 [String] 그래서 당신이 중첩 된 목록이 필요하게된다.

관련 문제