LINUX.ORG.RU

[Haskell] [FFI] Оформить IO Функцию

 ,


0

2

Здравствуйте, у меня есть вот такой код на С

#include <stdio.h>

void hello()
{
	printf("Hello");
}

int ret3()
{
	return 3;
}
И я хочу импортировать эти функции в Хаскель
{-# INCLUDE "hello.c" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module Example(c_hello,c_ret) where
import Foreign.C
import Foreign.C.String

foreign import ccall unsafe "hello" c_hello :: IO()
foreign import ccall unsafe "ret3" c_ret :: СInt
Если вызывать c_ret, то все происходит правильно, а если вызывать c_hello, то вывод откладывается до выхода из интерпретатора. Я неправильно оформляю IO функцию?

★★★★★
Ответ на: комментарий от Aswed

IO() + IO() что это за?

омг *фейспалм*

и эти люди говорят что знают хаскель >_<

redixin ★★★★
()
Ответ на: комментарий от redixin

ТС четко описал, что он делает и там видно, что проблема не в ленивости.

qnikst ★★★★★
()
Ответ на: комментарий от Aswed

Однако приведенный выше код все равно не скомпилится.

Он будет работать если дописать инстансы (так как в GHC Num уже не наследует интерфейсы Show и Eq):

import Control.Monad

instance Num () where
  _ + _ = ()
  _ * _ = ()
  abs _ = ()
  signum _ = ()
  fromInteger _ = ()

instance Num t => Num (IO t) where
  (+) = liftM2 (+)
  (*) = liftM2 (*)
  abs = liftM abs
  signum = liftM signum
  fromInteger = return . fromInteger

-- > () + ()
-- ()

-- FIXME: default Num (Int) ?

-- > print (1 :: Int) + print (2 :: Int)
-- 1
-- 2

-- > let getInt = fmap read getLine :: IO Int
-- > getInt + getInt
-- 1
-- 2
-- 3

Но всё равно порядок эффектов строго определён - (+) выражается через liftM2, тот через (>>=), а другого интерфейса к IO нет.

Сделать более общие инстансы IO a + IO a / a + IO a / IO a + a уже не очень получается (в силу того как работают классов типов - это не совсем паттерн-матчинг по типам).

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.