我需要知道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>
是不是?如果它是正确的,我如何找到最终结果?
谢谢!
答案 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。