2011-07-04 3 views
4

저는 하스켈을 처음 접했고 이런 상황에 도움이 필요합니다. 나는2 개 이상의 요소가 포함 된 튜플 목록에서 요소를 가져옵니다. (하스켈)

-- create a type for bank account 
type AcNo = String 
type Name = String 
type City = String 
type Amnt = Int 

type AcInfo = [(AcNo, Name, City, Amnt)] 

-- function to get the data of bank accounts to a list of tuples 
bankAccounts :: AcInfo 
bankAccounts = [("oo1", "Sahan", "Colomb", 100),("002", "John", "Jafna", 200)] 

내 요구 사항이 내가 쓴 기능이

--Function to check the balance of a person 
checkBalance :: bankAccounts -> AcNo -> Amnt 
checkBalance dbase number = Amnt|(AcNo, Name, City, Amnt) <- dbase, AcNo==number} 
(100)

했다 주어야한다 001의 계좌 번호에 해당하는 양, 예를 얻을 수 있습니다 다음과 같은 목록을 가지고

두 번째 줄은 오류 메시지를 표시하는 위치에서 멈 춥니 다.

Syntax error in input (unexpected `|')

이걸 좀 도와주고 싶습니다. 고맙습니다. 하스켈 타입의 이름은 대문자로 시작, 그래서 checkBalance의 종류가 귀하의 질문에

checkBalance :: AcInfo -> AcNo -> Amnt 

해야

답변

6

리콜, 당신은 지능형리스트를 사용하여 목표로하는 것,하지만 당신은이 없습니다 구문이 맞다. 계정이 dbase

*Main> checkBalance bankAccounts "oo1" 
100

에 있지만 그렇지 않은 경우 불면 경우

checkBalance dbase number = head [amnt | (acNo, name, city, amnt) <- dbase, 
             acNo == number] 

이 정의는 괜찮습니다.

*Main> checkBalance bankAccounts "001" 
*** Exception: Prelude.head: empty list

checkBalance위한 더 나은 형식이

checkBalance :: AcInfo -> AcNo -> Maybe Amnt 

이 일반적인 경우를 대표하는, 즉, dbase 또는 number는 포함되지 않을 수도있다.

+0

제공하신 도움에 감사드립니다. 예. 잠시 동안 나는 dbase에있는 계정에만 집중할 것입니다. 나는 당신이 언급 한 유형으로 실험 할 것입니다. 다시 한번 감사드립니다. –

7

Greg의 훌륭한 대답에 추가하면 논리적 단위를 구성하는 더 큰 값 집합에 튜플을 사용해서는 안된다는 점을 지적하고 싶습니다. Account 유형을 제안합니다. 요소에 액세스하거나 계정 변경을보다 편리하고 같이 일을하게 기록 구문을 사용하여 :

data Account = Account { acNo :: AcNo 
         , name :: Name 
         , city :: City 
         , amount :: Amnt 
         } deriving (Eq, Show) 

은 자세한 내용은 http://learnyouahaskell.com/making-our-own-types-and-typeclasses#record-syntax를 참조하십시오.

그런 다음 AcInfo이 아닌 Account으로 함수를 작성하고 일반 목록 함수를 사용해야합니다. 종종 기록에 의해 제공되는 추출 기능은 예에서와 같이, 충분히 좋은 :

checkBalance :: [Account] -> AcNo -> Maybe Amnt 
checkBalance dbase number = fmap amount $ find (\acc -> number == acNo acc) dbase 
여기

acNo acc는 계좌 번호를 얻고 amount acc는 계좌에서 금액을 가져옵니다.