"类型限制型变量,当β减少时#34;用例

时间:2018-01-31 22:46:37

标签: haskell

我正在学习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

1 个答案:

答案 0 :(得分:5)

使用f部分应用 f 1 2。这意味着1 :: a2 :: b

现在,一个数字文字(如14214.25)始终是Num类型类的一种类型。事实上:

Prelude> :t 1
1 :: Num t => t

目前尚不确定哪种类型(因为它可以是IntIntegralFloat等。但这意味着我们现在进一步限制了a的类型,因此结果也应该具有该类型约束。

如果我们使用了Char,那么a就是Char

Prelude> :t f 'a' 2
f 'a' 2 :: Char