我想创建一个函数,它把函数作为变量参数,我对函数参数(它本身就是一个函数)的唯一了解是,它们被 Package 在同一个单子中。
myFunc :: forall arguments output m.
MonadEffect m
=> (arguments -> m output)
-> m (argument -> m output)
myFunc fn = do
-- getting function's name using FFI and other stuff...
pure fn
当我显式地指定参数长度时,我可以写这个函数,
-- for function with ONE argument
myFunc1 :: forall argument1 output m
. MonadEffect m
=> (argument1 -> m output)
-> m (argument1 -> m output)
myFunc1 fn = do
-- do something
pure fn
-- for function with TWO argument
myFunc2 :: forall argument1 argument2 output m.
MonadEffect m =>
(argument1 -> argument2 -> m output) ->
m (argument1 -> argument2 -> m output)
myFunc2 fn = do
-- do something
pure fn
如何在类型级别将argument1 -> argument2 -> m output
写为argument -> m output
?
是否有任何类型/约束有助于这样做?
ps:我只是想弄清楚有没有可能
1条答案
按热度按时间m1m5dgzv1#
在Haskell中,可以定义计算函数返回类型的类型族:
以及其参数类型的类型级列表(按相反顺序):
这将允许您编写:
这将使类型变量
output
和arguments
在函数体中可用:这可能适合也可能不适合您要做的事情,它可能在PureScript中工作也可能不工作。
不管怎样,这里有一个自包含的Haskell例子: