我和LYAH一起玩奇怪的豆腐示例。我通过消除Frank构造函数中的记录字段来简化它,所以这就是:
Sub FormulaFill()
Dim strFormulas(1 To 1) As Variant
With ThisWorkbook.Sheets("Export Worksheet")
strFormulas(1) = "=INDEX('sheet1'!E:E,MATCH('Export Worksheet'!A2,'sheet1'!A:A,0))"
.Range("J1").Forumla = strFormulas(1)
.Range("J:J").FillDown
End With
End Sub
它工作而且相当清晰。但是现在我想通过class Tofu t where
tofu :: j a -> t a j
data Frank a m = Frank (m a) deriving (Show)
instance Tofu Frank where
tofu x = Frank x
函数修改a
类型的值。所以我开始在实例声明中扩展tofu
的值:
x
因此我得到了:
instance Tofu Frank where
tofu (m y) = Frank (m y)
好的,接下来我尝试在实例声明中进行实际的模式匹配:
tofu.hs:13:15: Parse error in pattern: m
因此我得到了:
instance Tofu Frank where
tofu (Just y) = Frank (Just y)
所以,问题是:如何在豆腐的实例声明中使用类型tofu.hs:16:15:
Couldn't match type `j' with `Maybe'
`j' is a rigid type variable bound by
the type signature for tofu :: j a -> Frank a j at tofu.hs:16:9
Expected type: j a
Actual type: Maybe a
In the pattern: Just y
In an equation for `tofu': tofu (Just y) = Frank (Just y)
In the instance declaration for `Tofu Frank'
的值?是否有可能使失败的例子在没有修改豆腐类的情况下工作?
答案 0 :(得分:3)
TL; DR:你不能。
假设MyDate = #2016-2-27#
MyMonth = Right("0" & Month(MyDate), 2)
MyDay = Right("0" & Day(MyDate), 2)
FormattedDate = Year(MyDate) & "-" & MyMonth & "-" & MyDay
MsgBox FormattedDate
满足t
。函数类型状态
Tofu t
实际上意味着
tofu :: j a -> t a j
因此,调用者可以选择tofu :: forall j a. j a -> t a j -- t is chosen by the class instance
和j
。来电者可以传递a
或[Int]
或Maybe Char
(此处Either String Bool
和j ~ Either String
)。函数a ~ Bool
不能假设任何特定情况,并且必须仅使用“常规”操作来完成其工作。
如何在豆腐的实例声明中使用类型a的值
可能没有tofu
值。 E.g。
a
因为我们可以将豆腐实例化为
data T a = K Int
即使周围没有tofu :: T a -> t a T
,我们也可以在tofu (K 6 :: T Bool)
中调用它。
类似的论点适用于
Bool
此处data U a = U (a -> Int)
包含一个期望U Bool
的函数,而不是松散地提供或“包含”它。