함수를 작성하는 몇 가지 방법이 있습니까 f :: (a -> b -> ... -> t) -> (Monad m => m a -> m b -> ... -> m t)
, 어떤 n
에 대해 기본적으로 liftMn
?함수 작성 (a -> b -> ... -> t) -> (모나드 m => ma -> mb -> ... -> mt)
(편집 : 고정 무의미한 예.)
내가 FRP 라이브러리를 쓰고 있어요, 나는 막연하게 같은 코드가 수 있다면 깔끔한 줄 알았는데 :
main = do
input1 <- signalFromTextBoxTheUserMayTypeANumberInto
input2 <- signalFromAnotherTextBox
divided <- signal div input1 input2
signal (\x -> showTextAlert ("input1 `div` input2 is " ++ show x)) divided
봤는데을 타입 패밀리를 사기 위해 노력했지만, 실제로는 할 수 없다고 생각하기 시작했습니다. unsafePerformIO 한 번 평가됩니다로서, 이것은 분명히 작동하지 않습니다
type Action a = IORef a -> IO()
type Listener = IO()
newtype Signal a = Signal (IORef (SigData a))
data SigData a = SigData {
trigger :: Action a,
output :: IORef a,
listeners :: [Listener]
}
class Sig a where
type S a
mkSig :: [AnySignal] -> a -> S a
instance Sig b => Sig (a -> b) where
type S (a -> b) = Signal a -> S b
mkSig dependencies f =
\[email protected](Signal sig) ->
let x = unsafePerformIO $ readIORef sig >>= readIORef . output
in mkSig (AnySignal s : dependencies) (f x)
instance Sig Int where
type S Int = IO (Signal Int)
out <- newIORef x
self <- Signal <$> (newIORef $ SigData {
trigger = \ref -> writeIORef ref $! x,
output = out,
listeners = []
})
mapM_ (self `listensTo`) deps
return self
을하고, 그 다음에 그 값을 유지하고 작업 않은 경우 여전히 못생긴 해키 일반적으로 나쁜 것 : 나는 현재 같은 일을하고 있어요 . 이것을 할 수있는 방법이 있습니까, 아니면 그냥 그 아이디어를 놓아 줘야할까요?
자신에게 물어보십시오 :이 조합기를 적절한 유형으로 제공 할 수 있습니까? 그렇지 않다면 합리적인 유형으로 만들기 위해 어떤 종류의 까만 마술이 필요한가요? 이 도움이 될 수 있습니다 : [polyvariadic haskell 함수를 만드는 방법?] (http://stackoverflow.com/q/3467279/417501) – fuz