1

繰り返しになりますが、顧客のリストを反復処理して正しい顧客を見つけようとしています。顧客が見つかったら、顧客に関連付けられているゼロ以外の整数を表示したいと考えています。どうすればよいかわかりません。店にはその人の名前の記録が 1 つしかないことはわかっています。

type Name = String
type Customer = (Name,Int,Int)
type Shop = [Customer]
shop = [cust1, cust2]

cust1 = ("Steve", 321, 123) :: Customer
cust2 = ("John", 0,678) :: Customer

getName :: Customer -> Name
getName (a, b,c) = a

getNumbers :: Customer -> [Int]
getNumbers (a,b,c) = filter (/=0) [b,c] 


rental:: Shop-> Name -> [Int]
rental shop' name' = map getNumbers [ x|x<-shop',getName x == name']
4

2 に答える 2

4

エラーメッセージを読むのはとても便利です!

test23.hs:10:9:
    Couldn't match type `(Name, t0)' with `(Name, Int, Int)'
    Expected type: Customer
      Actual type: (Name, t0)

あなたが持っている

getName (a, b) = a

しかし、定義されています

type Customer = (Name,Int,Int)

右の関数は次のようになります

getName (a, _, _) = a

修正後、次のメッセージが表示されます。

test23.hs:17:26:
    Couldn't match type `[Int]' with `Int'
    Expected type: Customer -> Int
      Actual type: Customer -> [Int]
    In the first argument of `map', namely `getNumbers'
    ...
    In an equation for `rental'

しかし、エラーはgetNumbersではなく、 の署名にありrental:: Shop-> Name -> [Int]ます。でなければなりません:

rental:: Shop-> Name -> [[Int]]
于 2013-10-11T22:53:52.353 に答える