【发布时间】:2020-08-17 09:48:22
【问题描述】:
我正在尝试为“制表”编写一个定义,该函数会生成给定 Map 中值的单曲面摘要 对应于给定可折叠集合中的键。
这是我的代码:
module Foldables where
import Prelude hiding (Applicative(..), any, concat)
import Data.Foldable
import Data.Semigroup
import qualified Data.Map as Map
import Data.Map (Map)
import Data.Map.Append (AppendMap(..))
import Data.List (intersperse)
import Data.Maybe (maybe)
import Data.Monoid (Any(..), Sum(..))
import GHC.Generics (Generic)
tabulate :: (Ord k, Foldable f, Monoid a) => (v -> a) -> Map k v -> f k -> a
tabulate t m = foldMap (tabulate . k v)
我收到此错误:
src/Foldables.lhs:295:27: error:
• Data constructor not in scope: Tabulate :: b0 -> a
• Perhaps you meant variable ‘tabulate’ (line 295)
src/Foldables.lhs:295:38: error:
Variable not in scope: k :: t0 -> k -> b0
除了第二行括号中的内容外,请不要更改任何内容
更新:我想我更接近于理解这一点。这是我的新代码。我意识到它不完整,但它至少可以编译。
tabulate :: (Ord k, Foldable f, Monoid a) => (v -> a) -> Map k v -> f k -> a
tabulate t m = foldMap (\x -> mempty maybe [m] maybe map [t])
现在它没有通过阴谋集团测试:
Falsified (after 2 tests):
<fun>
fromList [(False,'\DC4'),(True,'\1054302')]
[True,True]
无论我做什么,似乎都会有一些变化
如果 tabulate 的第三个参数不是空的,我假设我需要的是某种条件?
【问题讨论】:
-
请添加
Tabulate的定义(即提供minimal reproducible example) -
抱歉,我应该更具体一些。这是制表的定义。我在开头行添加了这一点,并且还包括了我所有的导入。
-
除了@Ackdari 的问题,第二行的
k和v代表什么? -
地图的变量
-
@steve 我看不到
k和v的绑定位置,因为您传递的参数是t和m。此外,我看不出如何将一个应用于另一个。
标签: haskell monoids ord tabulate foldable