2017-01-27 19 views
-2

저는 haskell에서 Table 데이터 유형을 구현 했습니다만, 가장 작은 키를 반환하는 내 minkey 함수는 올바른 결과를주지 않는 것 같습니다. 난 그냥 테이블 초기화 왜 ..하스켈에서 테이블 ADT 구현하기 - 내 미니 키 기능이 작동하지 않는 이유는 무엇입니까?

module Table where 
import Prelude hiding (init,read,length) 

type Key = Int 
type Value = String 

errorvalue = "ERROR" 

maxentries = 5 
data Table = Empty | App(Key,Value,Table) 
deriving Show 

init :: Table 
insert :: (Key,Value,Table) -> Table 
isin :: (Key,Table) -> Bool 
read :: (Key,Table) -> Value 
empty :: Table -> Bool 
delete :: (Key,Table) -> Table 
update :: (Key,Value,Table) -> Table 
length :: Table -> Int 
full :: Table -> Bool 
minkey::Table->Key 

init = Empty 

minkey(App(k,v,init))=k 
minkey(App(k,v,t))= if k>minkey(t) then minkey(t) else k 

insert(k,v,t) = if v == errorvalue then t 
      else if isin(k,t) then t 
    else if full(t) then t 
      else App(k,v,t) 

isin(x,Empty)  = False 
isin(x,App(k,v,t)) = if x == k then True 
      else isin(x,t) 

read(x,Empty)  = errorvalue 
read(x,App(k,v,t)) = if x == k then v 
      else read(x,t) 

empty(Empty)  = True 
empty(App(k,v,t)) = False 

delete(x,Empty)  = Empty 
delete(x,App(k,v,t)) = if x == k then t 
      else App(k,v,delete(x,t)) 

update(k,v,Empty)  = Empty 
update(k,v,App(k2,v2,t)) = if k == k2 then App(k,v,t) 
      else App(k2,v2,update(k,v,t)) 

length(Empty)  = 0 
length(App(k,v,t)) = 1 + length(t) 

full(t) = if length(t) == maxentries then True 
     else False 

다른 스크립트에서 궁금 : 나는 예상대로 출력이되지 1 해요 인쇄 할 때

import Table 
import Prelude hiding (init,read,length) 

main :: IO() 

main = do 
let k1 = 9 
let k2 = 8 
let k3 = 1 
let k4 = 6 
let k5 = 10 


let v1 = "q" 
let v2 = "a" 
let v3 = "si" 
let v4 = "se" 
let v5 = "fu" 

let i0 = init 
let i1 = insert(k1,v1,i0) 
let i2 = insert(k2,v2,i1) 
let i3 = insert(k3,v3,i2) 
let i4 = insert(k4,v4,i3) 
let i5 = insert(k5,v5,i4) 

let m = minkey(i5) 
print m 
print i5 

,하지만 마지막 키는 테이블로 가져 (이 경우 10) 내가 뭘 잘못하고 있니? 어쩌면 재귀?

+1

'minkey (App (k, v, init)) = k'에서'init '은 변수 이름으로 간주되며'Empty '가 아닙니다. 괄호를 너무 많이 사용하면 코드가 부자연 스럽습니다. 그리고 list를 사용할 수도 있습니다. – jeiea

+0

감사합니다. 나는 정말로 그것을 알아 차리지 못했다. .. 지금 모든 것이 올바르게 작동하고있다. 나는 그것이 좋지 않다는 것을 안다. 나는 그것을 혼자서 구현하고 싶었다. 쓰기는 대답이므로 받아 들일 수 있습니다. – Teo

+1

'-Wall' 플래그를 사용하여 GHC의 경고를 켜는 것이 좋습니다. 많은 일반적인 오류가이 오류를 포함하여보고됩니다. – chi

답변

1

minkeyinit은 인수 이름으로 간주되며 Empty이 아니므로 패턴은 항상 해당 행에서 일치합니다. 어쩌면 GHC가 당신에게 -Woverlapping-patterns으로 경고했을 수도 있습니다.

init을 변경할 수없는 경우 사례 표현을 사용할 수 있습니다.

+0

실제로. GHC는 또한 로컬 init에 의한 글로벌'init'의 shadowing에 대해서 경고해야합니다. – chi