문제점을 이해할 수 없습니다. 'a'는 bool이 아니며 bool이되어서는 안됩니다. 그렇다면 부랑교는 왜 기대 되는가?하스켈 오류 : 예상 유형 'Bool'과 유추 된 유형 'IO b'를 일치시킬 수 없습니다.
코드 :
probablyPrime n 0 = False
probablyPrime n t =
do a <- randomRIO(3, n-1 :: Integer)
let comp = defComp(a,n)
let ret = (not comp) && (probablyPrime n t-1)
return ret
defComp a n = xcon1 && xcon2
where (s,m) = findsm n
x = a^m `mod` n
xcon1 = x /= 1 || x /= n-1
xcon2 = comploop x n s
comploop x n 0 = False
comploop x n s = x1 || (comploop x n (s-1))
where x1 = (x^2 `mod` n) == 1
findsm n = (s,m)
where m = findm n
s = n/m
findm n = m
where f = (logBase 2 n) - (truncate (logBase 2 n))
m' = 2^f
m = m_ify m'
m_ify m | m mod 1 == 0 = m
| otherwise = m_ify (m*2)
오류 :
Couldn't match expected type `Bool' against inferred type `IO b'
In a stmt of a 'do' expression:
a <- randomRIO (3, n - 1 :: Integer)
In the expression:
do { a <- randomRIO (3, n - 1 :: Integer);
let comp = defComp ...;
let ret = (not comp) && (probablyPrime n t - 1);
return ret }
In the definition of `probablyPrime':
probablyPrime n t
= do { a <- randomRIO (3, n - 1 :: Integer);
let comp = ...;
let ret = ...;
.... }
함수 호출 구문에주의해야합니다. 'f (x, y)'를 여러 번 사용 합니다만, 하스켈에서는 거의 불가능합니다. 이것은 하나의 튜플에 함수를 적용합니다. 당신은'f x y'를 원한다. –
(실제로, 더 정확하게 말하자면'randomRIO'를 원하지만'defComp'가 아닙니다.) –
논리에 대한 기본적인 문제가 있습니까? 만약 당신이''아마도''프라임 n t'를't = 0'으로,'아마도 프라임 n 0'을'거짓'이라면,'False'가됩니다. –