하스켈 , 74 67 63 바이트
r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d
온라인으로 사용해보십시오!
설명
H.PWiz가 알아 낸 것처럼 여기에서 Haskell의 어휘 분석기를 사용하여 문자열을 부분으로 나눌 수 있습니다. (이전 내가 사용했다 span(>'/')
) 그리고 Laikoni는 지적이 <$>
단지 같은 작품 mapSnd
에서 Data.Tuple
.
패턴 가드는 코드를 사용하고자하는 세 개의 숫자로 나눕니다 lex
. lex
첫 번째 토큰을 해제하기 위해 haskell의 어휘 분석기를 호출합니다. 문자열을 구문 분석하는 가능한 방법을 나타내는 각 요소가있는 목록을 리턴합니다. 이 요소는 첫 번째 요소가 첫 번째 토큰이고 나머지 문자열은 두 번째 요소 인 튜플입니다. 입력 형식이 매우 규칙적이기 때문에 정확히 하나의 구문 분석 만 할 수 있으므로 항상 첫 번째 형식을 취할 수 있습니다. 가장 먼저 할 일은 lex
입력을 호출 하는 것입니다
lex x
그런 다음 목록에서 풀어서 2 튜플을 제공합니다.
lex x!!0
첫 번째 토큰은 혼합 된 분수의 전체 부분으로, 여전히 파싱 할 공백이 앞에옵니다. 그런 다음 튜플이기 때문에 Functors
우리가 사용할 수있는 (<$>)
별칭 fmap
적용하는 lex
튜플의 두 번째 요소입니다.
lex<$>lex x!!0
이것은 공간을 통해 먹고 우리의 분수의 분자 인 다음 토큰을 끊습니다. 이제 이것을 사용하여 패턴 일치에 바인딩합니다 <-
. 우리의 패턴은
(a,(c,s:d):_)
a
분수의 전체 부분 인 첫 번째 토큰을 가져옵니다. :_
우리의 두 번째 결과 목록을 해제합니다 lex
. c
우리가 어셈블 한 두 번째 토큰, 즉 분수의 분자를 잡습니다. 남아있는 모든 것은 바인딩되어 s:d
첫 번째 문자로 분할되며 형식은 a /
이며 나머지는 분모가됩니다.
이제 입력을 파싱 했으므로 실제 계산을 수행합니다.
show(r a*r d+r c)++s:d
r
이전에 바인딩 한 읽기 기능은 어디에 있습니까 ?
lex
목록이 실패하면 비어 있고 성공하면 비어 있지 않은 것을 반환하는 것이 중요 합니다. 이것이 Maybe
내가 모르는 이유는 무엇입니까?