Скажем, у меня есть соглашение в Haskell, где я определяю ряд функций, таких как:
data Node = MkNode
s0 :: Node -> s -> Node
s0 a _ = a
s1 :: (s -> a) -> (a -> Node) -> s -> Node
s1 a b c = b (a c)
s2 :: (s -> a) -> (s -> b) -> (a -> b -> Node) -> s -> Node
s2 a b c d = c (a d) (b d)
s3 :: (s -> a) -> (s -> b) -> (s -> c) -> (a -> b -> c -> Node) -> s -> Node
s3 a b c d e = d (a e) (b e) (c e)
Если возможно, я хотел бы определить функцию sn
, которая принимает переменное число аргументов, всегда с этим шаблоном. Я видел подобные вещи до использования классов типов, но я не могу понять, как это сделать в этом случае. Например, я могу представить:
class NAble elt where
sn :: elt -> state -> Node
instance NAble Node where
sn elt _ = elt
Но тогда я застрял. Я не уверен, каким будет рекурсивное определение. Возможно, что-то вроде:
instance (NAble b) => NAble (a -> b) where
sn eltMaker state = ss (eltMaker state) state
Но это, очевидно, не совсем верно. Не уверен, что это возможно, но было бы здорово, если бы это было так. Конечно, порядок аргументов может измениться, если это поможет сделать это правильно, но было бы очень хорошо, чтобы это сработало. Любая помощь будет оценена!