Я пытаюсь определить экземпляр 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 не найден, но suprisingly работает F.foldr в ghci.
*MyList> F.foldr (:) "" (MyList "hello")
"hello"
Но только в ghci, если я пытаюсь импортировать MyList в файл, foldr, F.foldr, MyList.F.foldr и MyList.foldr не работают.
Почему это работает в ghci, но не в реальном?
Думаю, мне нужно снова импортировать Data.Foldable(и снова в каждом файле с помощью MyList)
Есть ли лучший способ сделать это (например, экспортировать Data.Foldable в MyList)?
(Я новичок в Haskell и особенно с модулями)
После нескольких ответов, похоже, нет чистого решения этой проблемы. Тем не менее, я уверен, что я не первый, что сделал, поэтому
Какова распространенная практика для решения этой проблемы?
Спасибо за помощь.