Как я могу реализовать функцию, которая возвращает элемент ns из списка с такой подписью? Я знаю обычный способ с оператором !!, но вот тип Natural , поэтому Haskell не может сопоставить его с ожидаемым Int .
!!
indexed :: Natural -> [a] -> a
Я предполагаю, что вы имеете в виду Numeri c .Natural package
Это немного похоже на хак, но вы могли бы сделать:
indexed :: Natural -> [a] -> a indexed n xs = xs !! (fromInteger (toInteger n))
Может просто так:
import Numeric.Natural indexed :: Natural -> [a] -> a indexed nat xs = (xs !! (fromIntegral nat))
Пробуем под ghci:
λ> λ> z = 0 :: Natural λ> :t z z :: Natural λ> z 0 λ> λ> indexed z [1..3] 1 λ>
Я предполагаю, что Natural равно Numeric.Natural. Тогда вы можете просто сделать
Natural
Numeric.Natural
indexed :: Natural -> [a] -> a indexed 0 (x:_) = x indexed _ [] = error "OutOfRange" indexed n (_:xs) = indexed (n-1) xs