我正在学习Haskell,当我们减少这个表达时,我不明白这个逻辑:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class TableModel(QAbstractTableModel):
def __init__(self, *args, **kwargs):
QAbstractTableModel.__init__(self, *args, **kwargs)
self.values = [['green', 'car', 'available', ['a', 'b', 'c', 'd']],
['red', 'airplane', 'available', ['b', 'c', 'd', 'e']],
['yellow', 'boat', 'not available', ['c', 'd', 'e', 'f']]]
def columnCount(self, parent=QModelIndex()):
return 4
def rowCount(self, parent=QModelIndex()):
return len(self.values)
def data(self, index, role=Qt.DisplayRole):
if 0 <= index.row() < self.rowCount() and 0 <= index.column() < self.columnCount():
if role == Qt.DisplayRole:
return self.values[index.row()][index.column()]
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
splitter = QSplitter()
self.tv = QTableView()
self.lv = QListView()
self.setLayout(QHBoxLayout())
splitter.addWidget(self.tv)
splitter.addWidget(self.lv)
self.layout().addWidget(splitter)
model = TableModel()
self.tv.setModel(model)
self.tv.hideColumn(3)
self.tv.clicked.connect(self.on_clicked)
def on_clicked(self, ix):
model = ix.model()
m_list = model.index(ix.row(), 3).data()
self.lv.setModel(QStringListModel(m_list))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
我不明白为什么我们受到Num的限制,我会期待更多的东西:
Prelude> let f :: (Ord a, Num b) => a -> b -> a; f = undefined
Prelude> :t f 1 2
f 1 2 :: (Num a, Ord a) => a
答案 0 :(得分:5)
您使用f
部分应用 f 1 2
。这意味着1 :: a
和2 :: b
。
现在,一个数字文字(如1
,42
,14.25
)始终是Num
类型类的一种类型。事实上:
Prelude> :t 1
1 :: Num t => t
目前尚不确定哪种类型(因为它可以是Int
,Integral
,Float
等。但这意味着我们现在进一步限制了a
的类型,因此结果也应该具有该类型约束。
如果我们使用了Char
,那么a
就是Char
:
Prelude> :t f 'a' 2
f 'a' 2 :: Char