Tengo el siguiente:¿Por qué no puedo declarar el tipo inferido?
runcount :: (Eq a, Num b) => [a] -> b
runcount = runcountacc 0
runcountacc :: (Eq a, Num b) => b -> [a] -> b
runcountacc n (_:[]) = runcountacc (n+1) []
runcountacc n (x:xs) = runcountacc (n+(if head xs==x then 0 else 1)) xs
runcountacc n _ = n
que genera este error cuando intento cargarlo en abrazos:
:6 - Cannot justify constraints in explicitly typed binding
*** Expression : runcountacc
*** Type : (Eq a, Num b) => b -> [a] -> b
*** Given context : (Eq a, Num b)
*** Constraints : Eq c
Y el siguiente error cuando se carga en ghci:
:6:23: Ambiguous type variable `a0' in the constraint:
(Eq a0) arising from a use of `runcountacc'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: runcountacc (n + 1) []
In an equation for `runcountacc':
runcountacc n ([x]) = runcountacc (n + 1) []
Sin embargo, cuando se elimina la declaración de tipo runcountacc
:
runcount :: (Eq a, Num b) => [a] -> b
runcount = runcountacc 0
runcountacc n (_:[]) = runcountacc (n+1) []
runcountacc n (x:xs) = runcountacc (n+(if head xs==x then 0 else 1)) xs
runcountacc n _ = n
Las cargas de código bien y cuando se le pide ghci lo que el tipo de runcountacc
es, obtenemos lo siguiente:
λ> :t runcountacc
runcountacc :: (Num a, Eq a1) => a -> [a1] -> a
Por qué no puedo declarar el tipo inferido de runcountacc
?
Antes que nada, los abrazos son antiguos, debes usar GHc. En segundo lugar, este no es un problema específico de abrazos, se obtiene un error similar con ghc. – HaskellElephant
@HaskellElephant abrazos siendo "antiguo" no es una buena razón para evitarlo. La implementación aún funciona. – singpolyma
@singpolyma, sí, ser viejo no es suficiente razón por sí mismo, pero como la última compilación es de 2006, no es compatible con las nuevas bibliotecas y no es compatible con el estándar haskell 2010. Además, muchas de las razones para usar abrazos (como el intérprete) se han implementado en GHC. – HaskellElephant