По-видимому, подпись моего типа отключена. С тех пор я узнал, почему. Теперь мне интересно узнать больше о предполагаемой подписи GHCI на моей опечатке. Я пытался заставить этот код работать:Haskell: В чем разница между `Num [a] => a` и` Num a => [a] `
elemNum :: (Eq a, Num b) => a -> [a] -> b
elemNum e l = f e l
where f _ [] = [] -- this was my typo, supposed to read 0
f e (x:xs)
| x == e = 1 + f e xs
| otherwise = f e xs
Он явно не работает по причине, указанной выше; но, если я удалю свою подпись компилирует (не знаю, почему, объясните, пожалуйста), и я получаю эту подпись:
elemNum :: (Num [a], Eq t) => t -> [t] -> [a]
Я никогда не видел класс типов Num [a]
перед тем .. Что это значит, и как делает он сравнивается с (Num a) => [a]
.
Могу ли я сделать '[a]' членом 'Num', возможно ли, если да, можете ли вы представить простой пример? Если нет, почему бы и нет? –
Да, вы могли бы. Например, если вы хотите предоставить многочлены, но это будет плохая идея в целом. экземпляр Num a => Num [a] где fromIntegral a = [a] (a: as) + (b: bs) = (a + b) :(as + bs) [] + bs = bs as + [] = as ... –
Технически вы можете сделать что-либо экземпляром любого типа (при условии, что соответствующие виды), выполнив что-то вроде 'instance Num [a], где fromInteger x = undefined; x + y = undefined' и т. д. Очевидно, это было бы не полезно. –