잘 이해했다면 String
의 목록에서 문자를 찾고 이전 색인의 문자를 이전 색인에서 반환하는 함수가 필요합니다. 같은
뭔가 :
f ["JOHN", "ALICE"] 'C' == 'H'
먼저 당신이 Char
리터럴 간단한 하스켈에서 따옴표 ('A'
), 큰 따옴표 ("ABC"
)와 String
리터럴로 구분되는 것을 알 필요가있다.
하스켈에서 String
은 [Char]
의 별명이므로 "ABC"
은 ['A', 'B', 'C']
과 같습니다.
이것은 하스켈에서 다음과 같은 함수를 정의 할 수 없다고 말했습니다. f a a = stuff
. GHC는 a
이 여러 번 정의되었다고 불평 할 것입니다. 두 개의 인수에 속성이 있는지 확인하려면 guard patterns이 필요합니다.
그래서 나는 다음과 같이 첫 번째 함수를 작성합니다
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
는 경우 str
에 Maybe String
를 반환해야 찾을 수 없거나 첫 번째입니다. x1
실제로
- 보통 하스켈에서 목록 매개 변수가 마지막
,
currying을 허용 할 정도로 오래 경우
f
은 확인하지 않습니다.
EDIT (Data.List
모듈에서) zip
와
다소 더 현명한 방법.
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 + 1) 번째 문자열에서 (m + 1) 번째 문자가"c
인 동안 "n 번째 문자열에서 m 번째 문자 임."을 만족하는 첫 번째 문자를 반환합니다. 결과는 Maybe
(Just 'H'
)로 래핑됩니다. 그렇지 않으면 Nothing
을 반환합니다 (Maybe
은 대략 Haskell의 nullable 유형 임).
zip ['a', 'b', 'c'] [1, 2] == [('a', 1), ('b', 2)]
결과리스트의 크기가 최소의 하나이다 :
zip
쌍 중 하나 개의리스트에서 두리스트를 병합 함수이다. 그래서 예에서, 무슨 일 것입니다 : 당신은 그럼 그냥 확인해야
zip "JOHN" (tail "ALICE") == [('J','L'), ('O', 'I'), ('H', 'C'), ('N', 'E')]
는 두 번째 문자가 검색된 하나입니다, 그리고 쌍의 첫 번째 문자를 반환합니다.
'head xs'는 패턴이 아닌 표현식입니다. 패턴에서는'[]'과':'와 같은 생성자와 변수 만 사용할 수 있습니다. – chi
지금 당신이 달성하려고하는 것은 분명치 않은 vvery입니다. 8n과 출력을 보여주십시오. ghc가 제공하는 오류에 대해 알고 싶다면 정의 된 각 줄을 ghci에 넣고': t'를 사용하여 서명을 요청하십시오. @chi 언급 된 오류를 수정 한 후에 – epsilonhalbe