Quiero crear una tupla que contenga una flecha y una cadena que describa la flecha. Si lo hago con funciones (en vez de flechas), las obras siguientes, como se esperaba:Haskell Flechas dentro de Tuples
funTimes10 = (*10)
describe10 = "times 10"
tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
puedo tener acceso a la función con fst
, y con snd
Me da la cadena de descripción de la función.
Sin embargo, si Puedo cambiar la función con una flecha, como en el siguiente:
aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
fst
todavía funciona y devuelve mi flecha, pero- i no recibe ninguna cadena de descripción con
snd
.
Sólo tengo este error mensaje:
Ambiguous type variable `a0' in the constraint:
(Arrow a0) arising from a use of `aTuple10'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `snd', namely `aTuple10'
In the expression: (snd aTuple10)
In an equation for `it': it = (snd aTuple10)
¿Por qué aparece este error, y lo que debo hacer, para evitarlo? mirada
eso es exactamente;) thx – frosch03
Cómo irritante. Uno esperaría que el sistema de tipos pueda concluir que 'snd aTuple10' tiene el tipo' String'; podría esto ser considerado un error en la implementación? Seguramente Haskell 2010 no especifica tal comportamiento. Uno podría argumentar que si la implementación no sabe qué tipo tiene la primera cosa, no sabrá dónde está la segunda cosa en la memoria, pero dado que estamos tratando aquí con tuplas en caja, siempre debe haber dos punteros, y por lo tanto el segundo elemento es fácilmente localizable, independientemente del tipo del primero. –
Una función como 'clase Boolish a where toBool :: a -> Bool; foo :: Boolish a => (a, b) -> b; foo (a, b) = if toBool a then b else undefined' es concebible, por lo que el resultado de la función puede depender de un parámetro ambiguo. Special-casing para 'snd' sería extraño en esa situación. – dflemstr