Я пытаюсь определить Foldable экземпляр в Haskell, и у меня есть некоторые проблемы с импортом.
Итак, сначала попробуйте: модуль MyList где
import Data.Foldable
data MyList a = MyList [a]
instance Foldable (MyList) where
foldr f b (MyList as) = foldr f b as
Результат (обычный, но раздражающий)
Неоднозначное вхождение `foldr '
Итак, я должен скрыть это от Prelude: модуль MyList где
import Prelude hiding (foldr)
import Data.Foldable
data MyList a = MyList [a]
instance Foldable (MyList) where
foldr f b (MyList as) = foldr f b as
Эта компиляцияЯ загружаю в ghci и пробую некоторые базовые вещи:
*MyList> foldr (:) "" (MyList "hello")
"hello"
*MyList> foldl (flip (:)) "" (MyList "hello")
<interactive>:1:0:
Ambiguous occurrence `foldl'
It could refer to either `Prelude.foldl', imported from Prelude at MyList.hs:4:0-28
or `Data.Foldable.foldl', imported from Data.Foldable at MyList.hs:5:0-19
*MyList>
Так что foldr работает, а foldl - нет.Мой первый вопрос:
Нужно ли мне вручную скрывать каждый отдельный метод, определенный в Data.Foldable из Prelude, это хороший способ сделать это?
.
Чтобы избежать этой проблемы, я пыталсявыполнить квалифицированный импорт: модуль MyList, где
import qualified Data.Foldable as F
data MyList a = MyList [a]
instance F.Foldable (MyList) where
foldr f b (MyList as) = foldr f b as
Кажется, что компилируется в GHC, но
*MyList> foldr (:) "" (MyList "hello")
<interactive>:1:14:
Couldn't match expected type `[Char]'
against inferred type `MyList Char'
In the third argument of `foldr', namely `(MyList "hello")'
In the expression: foldr (:) "" (MyList "hello")
In the definition of `it': it = foldr (:) "" (MyList "hello")
Foldr не найден, но удивительно, что F.foldr работает в GHCI.1029 *
Но только в ghci, если я пытаюсь импортировать MyList в файл, foldr, F.foldr, MyList.F.foldr и MyList.foldr не работают.
Почему это происходитработать в ghci, а не в реале?
Полагаю, мне нужно снова импортировать Data.Foldable (и снова в каждый файл, использующий MyList)
Есть ли лучший способ сделать это (например, экспортировать Data.Foldable в MyList)?
(я новичок в Haskell и особенно с модулями)
После нескольких ответов кажется, что нет чистого решения этой проблемы.Тем не менее, я уверен, что я не первый, кто делает это, поэтому
Какова обычная практика для решения такого рода проблем?
Спасибо за вашу помощь.