我正在看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
答案 0 :(得分:3)
我们将从计算x_start开始,这将是x_start = [3:组合0 [4]]
事实并非如此,因为x_start
和others
的类型为[[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'});
}
}
});
列表。这就是编译器试图说的。