Haskell:列出追加操作

时间:2015-04-26 23:17:21

标签: list haskell

我正在看99 problems solved in Haskell。我试图在这里了解一些基础知识。

    combinations :: Int -> [a] -> [[a]]
    combinations _ [] = [[]]
    combinations 0 _  = [[]]
    combinations k (x:xs) = x_start ++ others
    where x_start = [ x : rest | rest <- combinations (k-1) xs ]
          others  = if k <= length xs then combinations k xs else []

考虑,combinations 1 [3, 4]

模式与combinations k (x:xs)匹配。我们将从计算x_start开始,它将是x_start = [3 : combinations 0 [4]]

combinations 0 [4]将模式匹配combinations 0 [4]和&#34;返回&#34; [[]](1个elem空列表的列表)

我们现在看到x_start = [3 : combinations 0 [4]] ===> x_start = [3 : [[]]]。它是否正确?如果是这样的话x_start会在这一点上,按列表前置运算符:x_start = [[3, []]]与[[3]]不同?

当我尝试在ghci中打印时,它抱怨

No instance for (Num [t0]) arising from a use of ‘it’
In a stmt of an interactive GHCi command: print it

1 个答案:

答案 0 :(得分:3)

  

我们将从计算x_start开始,这将是x_start = [3:组合0 [4]]

事实并非如此,因为x_startothers的类型为[[a1]]。因此x_start = [3] : rest rest更有可能<-来自combinations 0 [4],因为这里的列表理解只是一个使用List Monad combinations 0 [4]的语法糖的[[]] 。由于定义[][3] : [],因此只有一个值 - [[3]]。最后,[3 : [[]]]Num

正如评论中提到的那样,var Post = sequelize.define("Post", { title: DataTypes.STRING, description: DataTypes.TEXT }, { classMethods: { associate: function (models) { Post.belongsTo(models.Category, {as: 'category', foreignKey:'categoryId'}); } } }); 表达式无法通过ghci输入,因为第一个元素是Num a,第二个元素是列表列表,而不是var Category = sequelize.define("Category", { code: DataTypes.STRING, description: DataTypes.STRING, img: DataTypes.STRING, }, { classMethods: { associate: function (models) { Category.hasOne(models.Category, {as: 'parent', foreignKey: 'parentId'}); } } }); 列表。这就是编译器试图说的。