left :: [String]->[Char]->Char
left [] _ = []
left (x:xs) (head xs) = x -- it says error at head
적절한 괄호를 사용했지만 여전히 구문 분석 오류가 발생했습니다. 그런데 목록에서 이전 요소를 가져 오려고합니다 [["A"],["B"],["C"],["D"],["E"]]
. 다른 실수가있을 수도 있습니다. Pls는 나를 수정합니다.
두 번째 질문은 이전 요소 이전 색인 문자를 어떻게 선택할 수 있는지입니다. 이 목록 [[ "J", "O", "H", "N"], [ "A", "L", "I", "C", "E"]] 및 "C ","H "를 기대하고 싶습니다. "C"는 2 번째 요소 4 번째 인덱스이고 "H"는 이전 요소 3 번째 인덱스입니다. 미리 Thnx
내가 당신을 잘 이해했다면 목록에서 문자를 찾고 String
선행 색인에서 선행 문자열의 문자를 반환 하는 함수가 필요합니다 .
다음과 같은 것 :
f ["JOHN", "ALICE"] 'C' == 'H'
먼저 Char
리터럴은 Haskell ( 'A'
) 에서 간단한 따옴표로 구분 String
되고 큰 따옴표 ( "ABC"
)로 리터럴은 구분 된다는 것을 알아야합니다 .
Haskell String
에서는에 대한 별칭 [Char]
이므로 "ABC"
는 ['A', 'B', 'C']
.
이것은 Haskell에서 다음과 같은 함수를 정의 할 수 없습니다 f a a = stuff
. GHC는 a
여러 번 정의 된 내용에 대해 불만을 제기합니다 . 따라서 두 인수에 속성이 있는지 확인하려면 가드 패턴 이 필요 합니다 .
따라서 다음과 같이 첫 번째 함수를 작성합니다.
left :: [String] -> String -> String
left [] _ = ""
left [x] _ = ""
left (x1:x2:xs) str
| x2 == str = x1
| otherwise = left (x2:xs) str
두 번째 질문 :
import Data.List
f :: [String] -> Char -> Maybe Char
f [] _ = Nothing
f [a] _ = Nothing
f (x1:x2:xs) c
| Just i <- elemIndex c x2 = Just $ x1 !! (i-1)
| otherwise = f (x2:xs) c
메모:
left
찾을 수 없거나 첫 번째 인 Maybe String
경우 도 반환해야합니다 str
.f
x1
실제로 충분히 긴지 확인하지 않습니다.편집하다:
zip
(모듈에서 Data.List
) 좀 더 영리한 접근 방식입니다 .
f :: [String] -> Char -> Maybe Char
f [] _ = Nothing
f [_] _ = Nothing
f (x1:"":xs) c = f xs c
f (x1:x2:xs) c = f' (zip x1 (tail x2))
where f' [] = f (x2:xs) c
f' ((a,b):l) = if b == c then a else f' l
이 버전은 충돌하지 않습니다. "n 번째 문자열의 m 번째 문자가되는 반면 (n + 1) 번째 문자열의 (m + 1) 번째 문자"는를 만족하는 첫 번째 문자를 반환합니다 c
. 결과는 Maybe
( Just 'H'
) 로 래핑됩니다 . 그렇지 않으면 Nothing
( Maybe
은 대략 Haskell의 nullable 형식)을 반환합니다 .
zip
한 쌍의 목록에서 두 목록을 병합하는 함수입니다.
zip ['a', 'b', 'c'] [1, 2] == [('a', 1), ('b', 2)]
결과 목록의 크기는 가장 작은 목록 중 하나입니다. 따라서 예제에서 발생하는 일은 다음과 같습니다.
zip "JOHN" (tail "ALICE") == [('J','L'), ('O', 'I'), ('H', 'C'), ('N', 'E')]
그런 다음 두 번째 문자가 검색된 문자인지 확인한 다음 쌍의 첫 번째 문자를 반환해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다