[끈] Haskell 목록 이해, 두 문자열 사이에 문자열 추가
정말 가까워요! 나는 확신 당신이 얻고있는 오류 메시지가 일치 할 수없는 것보다 뭔가 다른거야
[Char]
하고
String
이들은 동일하기 때문에 비록!타입 시그니처를 제거하면 어떻게되는지 봅시다
inserts
(ghci에서이 작업을 수행하지만 물론 파일을 통해서도 시도 할 수 있습니다).
Prelude> let inserts str pairs = [[x,str,z] | (x,z) <- pairs, length x == length z]
Prelude> :t inserts
inserts :: [a] -> [([a], [a])] -> [[[a]]]
좋아요, 꽤 일반적인 유형입니다. 아시다시피
String
는
[Char]
. 우리가 대체한다면
Char
위해
a
의 종류에
inserts
있으며 장착
[Char]
하여
String
, 우리는 것을 알 수 있습니다
inserts
에 전문 수 있습니다
String -> [(String,String)] -> [[String]]
.따라서 인수는 일치하지만 결과에 한 수준의 목록이 너무 많습니다. 그 이후, 꽤 논리적이다
x
,
str
및
z
그래서, 문자열은
[x,str,z]
문자열의 목록입니다. 필요한 것은이 세 문자열을 하나로 연결하는 것입니다.
x ++ str ++ z
목록 이해력의 왼쪽에있는 표현식으로 사용하여 목록을 '손으로'추가 할 수 있습니다. 또는이를 사용
concat [x,str,z]
하여 수행 할 수 있습니다 .
concat
목록 (
Char
이 경우 행위자의 목록)을 목록으로 병합 합니다.
두 번째 시도에서는 3 튜플의 문자열 대신 비슷한 것을 사용할 수 있습니다. 무엇을
(x, str, y)
해야하는지 아십니까? -------------------
유형이 정확하려면 첫 번째 기능이 다음과 같아야한다고 생각합니다.
inserts :: String -> [(String, String)] -> [String]
inserts str pairs = [x ++ str ++z | (x,z) <- pairs, length (x) == length (z)]
또는
inserts :: String -> [(String, String)] -> [[String]]
inserts str pairs = [[x,str,z] | (x,z) <- pairs, length (x) == length (z)]
, 필요에 따라.
출처
https://stackoverflow.com/questions/22080072