系统F中的Haskell绑定运算符包括种类

时间:2016-02-08 21:04:29

标签: haskell lambda system-f

我需要知道Haskell绑定类型(>> =)运算符的System F类型是什么。

到现在为止,我这样写了:

<parameter name="path" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["C:/Program     Files/Fishbowl/Server/reports/WorkOrder/"]]></defaultValueExpression>
</parameter>
<parameter name="module" class="java.lang.Object" isForPrompting="false">
    <defaultValueExpression><![CDATA[null]]></defaultValueExpression>
</parameter>
<parameter name="REPORTDESCRIPTION" class="java.lang.String"     isForPrompting="false">
    <defaultValueExpression><![CDATA["Generates a summary of the quantity     and value of all parts currently on hand. This is a LIFO/FIFO based report."]]>    </defaultValueExpression>
    </parameter>
    <parameter name="partNum" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA[]]></defaultValueExpression>
    </parameter>
    <parameter name="locationGroupID" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA[]]></defaultValueExpression>
    </parameter>
    <parameter name="AssetAccount" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["%"]]></defaultValueExpression>
    </parameter>
    <parameter name="dateRange1" class="java.util.Date" isForPrompting="false">
    <parameterDescription><![CDATA[This Month]]></parameterDescription>
    <defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression>
    </parameter>
    <parameter name="dateRange2" class="java.util.Date" isForPrompting="false">
    <defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression>
    </parameter>
    <parameter name="ckShowActiveCostingLayers" class="java.lang.String" isForPrompting="false">
    <parameterDescription><![CDATA[10,100]]></parameterDescription>
    <defaultValueExpression><![CDATA["10"]]></defaultValueExpression>
</parameter>
<parameter name="ckShowFulfilledCostingLayers" class="java.lang.String" isForPrompting="false">
    <parameterDescription><![CDATA[20,100]]></parameterDescription>
    <defaultValueExpression><![CDATA["100"]]></defaultValueExpression>
</parameter>
<parameter name="ckShowVoidedCostingLayers" class="java.lang.String" isForPrompting="false">
    <parameterDescription><![CDATA[30,100]]></parameterDescription>
    <defaultValueExpression><![CDATA["100"]]></defaultValueExpression>
</parameter>
<parameter name="ShowHistoricalData" class="java.lang.Boolean" isForPrompting="false">
    <defaultValueExpression><![CDATA[new Boolean(false)]]>        </defaultValueExpression>
    </parameter>
    <queryString>
</queryString>
<field name="QTY" class="java.lang.Double"/>
<field name="ORGQTY" class="java.lang.Double"/>
<field name="ORGTOTALCOST" class="java.lang.Double"/>
<field name="TOTALCOST" class="java.lang.Double"/>
<field name="DATECREATED" class="java.sql.Timestamp"/>
<field name="PARTNUMBER" class="java.lang.String"/>
<field name="PARTDESCRIPTION" class="java.lang.String"/>
<field name="InventoryAccount" class="java.lang.String"/>
<field name="LOCATIONGROUP_ID" class="java.lang.Integer"/>
<field name="COMPANY" class="java.lang.String"/>
<variable name="AssetValue" class="java.lang.Double">
    <variableExpression><![CDATA[$P{ShowHistoricalData}.booleanValue() == true ?
$F{ORGTOTALCOST} :
$F{TOTALCOST}]]></variableExpression>
</variable>
<variable name="TotalAsset" class="java.lang.Double" resetType="Group" resetGroup="Part" calculation="Sum">
    <variableExpression><![CDATA[$V{AssetValue}]]></variableExpression>
</variable>
<variable name="ReportTotal" class="java.lang.Double" calculation="Sum">
    <variableExpression><![CDATA[$V{AssetValue}]]></variableExpression>
</variable>
<variable name="locationTotal" class="java.lang.Double" calculation="Sum">
    <variableExpression><![CDATA[$V{AssetValue}]]></variableExpression>
</variable>
<variable name="TotalCost" class="java.lang.Double" resetType="Group" resetGroup="Part" calculation="Sum">
    <variableExpression><![CDATA[$V{UnitCost}]]></variableExpression>
</variable>
<variable name="GrandTotalAsset" class="java.lang.Double" calculation="Sum">
    <variableExpression><![CDATA[$V{AssetValue}]]></variableExpression>
</variable>
<variable name="GrandTotalCost" class="java.lang.Double" calculation="Sum">
    <variableExpression><![CDATA[$V{TotalCost}]]></variableExpression>
</variable>
<variable name="UnitCost" class="java.lang.Double">
    <variableExpression><![CDATA[$P{ShowHistoricalData}.booleanValue() == true ?
new Double($F{ORGTOTALCOST}.doubleValue() / $F{ORGQTY}.doubleValue()) :
new Double($F{TOTALCOST}.doubleValue() / $F{QTY}.doubleValue())]]>    </variableExpression>
</variable>
<variable name="DateFormat" class="java.lang.String" resetType="None">
    <variableExpression><!    [CDATA[(System.getProperty("REPORT_DATE_FORMAT"))]]></variableExpression>
</variable>

是不是?如果它是正确的,我如何找到最终结果?

谢谢!

1 个答案:

答案 0 :(得分:3)

你快到了。为类型变量添加显式量词,并删除每个变量使用的类型注释。

∀M:*->*. ∀A:*. ∀B:*. M A -> (A -> M B) -> M B

我使用了更传统的:而不是Haskell的::

但请注意,系统F没有更高的种类(例如*->*),因此上述类型只能在更强大的类型系统中找到(例如System Fω)。

此外,上面我“方便地”省略了对M的类型类限制,这使得该类型接近但不完全是Haskell类型>>=。 (另见@DanielWagner的评论)。

这种风靡一时的细节非常重要。否则,上面的类型是如此通用,以至于它没有人居住 - 没有lambda术语具有该类型。实际上,假设存在矛盾,f具有上述一般类型。然后,

f (λt:*. t->⊥) : ∀A,B:* . (A -> ⊥) -> (A -> B -> ⊥) -> B -> ⊥

其中⊥是任何空类型(例如,{Haskell中的Void)。但是,将作为任何非空类型(例如,在Haskell中为())与居民u,我们获取

f (λt:*. t->⊥) ⊥ : ∀B:* . (⊥ -> ⊥) -> (⊥ -> B -> ⊥) -> B -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ : (⊥ -> ⊥) -> (⊥ -> ⊤ -> ⊥) -> ⊤ -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ (λx:⊥. x) : (⊥ -> ⊤ -> ⊥) -> ⊤ -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ (λx:⊥. x) (λx:⊥. λy:⊤. x) : ⊤ -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ (λx:⊥. x) (λx:⊥. λy:⊤. x) u : ⊥

所以有人居住 - 矛盾。

更为非正式的是,上述仅仅证明data T a = T (a -> Void)不能成为monad。