将C代码翻译成Haskell
如何将这部分C代码翻译成Haskell?据我所知,我必须使用状态单子,但我不知道如何使用将C代码翻译成Haskell,c,haskell,translate,C,Haskell,Translate,如何将这部分C代码翻译成Haskell?据我所知,我必须使用状态单子,但我不知道如何使用 int x = 1; int y = 2; x = x * y; y = y + x; 函数式语言的要点是不要这样做、创建新值或使用递归 如果您只想打印这些值 x = 1 y = 2 a = x*y b = y+x main = do putStrLn ("x*y: " ++ a) putStrLn ("y+x: " ++ b) 如果这是一个家庭作业,请按
int x = 1;
int y = 2;
x = x * y;
y = y + x;
函数式语言的要点是不要这样做、创建新值或使用递归 如果您只想打印这些值
x = 1
y = 2
a = x*y
b = y+x
main = do
putStrLn ("x*y: " ++ a)
putStrLn ("y+x: " ++ b)
如果这是一个家庭作业,请按此标记,我将更改我的答案。函数式语言的要点是不要这样做,创建新值或使用递归 如果您只想打印这些值
x = 1
y = 2
a = x*y
b = y+x
main = do
putStrLn ("x*y: " ++ a)
putStrLn ("y+x: " ++ b)
如果这是一项家庭作业,请将其标记为“是”,我将更改我的答案。假设您有一对整数作为状态:
f = do put (1,2)
modify (\(x,y) -> (x*y,y))
modify (\(x,y) -> (x,y+x))
这就是你想要的吗?让我们假设,你有一对整数作为状态:
f = do put (1,2)
modify (\(x,y) -> (x*y,y))
modify (\(x,y) -> (x,y+x))
这就是你想要的吗?直译会用到:
import Data.IORef
main::IO()
main=do x a)->IORef a->IORef t->IO()
组合器f x y=do y_val f v y_val)
addTo::Num a=>IORef a->IORef a->IO()
addTo=组合器(+)
multWith::Num a=>IORef a->IORef a->IO()
multWith=组合器(*)
main::IO()
main=do x直译将使用:
import Data.IORef
main::IO()
main=do x a)->IORef a->IORef t->IO()
组合器f x y=do y_val f v y_val)
addTo::Num a=>IORef a->IORef a->IO()
addTo=组合器(+)
multWith::Num a=>IORef a->IORef a->IO()
multWith=组合器(*)
main::IO()
main=do x如果用元组标识“可变”变量,则可以在元组上定义转换操作并将其“链接”在一起:
vars x y = (x,y)
setX (x,y) x' = (x', y)
setY (x,y) y' = (x, y')
appX (x,y) f = (f x, y)
appY (x,y) f = (x, f y)
app2X (x, y) f = (f x y, y)
app2Y (x, y) f = (x, f x y)
set…
设置值,app…
对其应用函数,app2…
对两个值应用函数并将其存储在x或y中。然后,您可以执行以下操作:
(vars 3 5) `setX` 14 `appY` (2*)
-- result: (14,10)
你的例子是:
(vars 1 2) `app2X` (*) `app2Y` (+)
-- result: (2,4)
当然,这稍微扩展了“可变”的定义,但这个解决方案已经到了状态
或编写器
单子的一半。如果您用元组标识“可变”变量,您可以在其上定义转换操作并将其“链接”在一起:
vars x y = (x,y)
setX (x,y) x' = (x', y)
setY (x,y) y' = (x, y')
appX (x,y) f = (f x, y)
appY (x,y) f = (x, f y)
app2X (x, y) f = (f x y, y)
app2Y (x, y) f = (x, f x y)
set…
设置值,app…
对其应用函数,app2…
对两个值应用函数并将其存储在x或y中。然后,您可以执行以下操作:
(vars 3 5) `setX` 14 `appY` (2*)
-- result: (14,10)
你的例子是:
(vars 1 2) `app2X` (*) `app2Y` (+)
-- result: (2,4)
当然,这稍微扩展了“可变”的定义,但这个解决方案已经到了状态
或编写器
单子的一半。另一种方法是考虑变量的“版本”——开始处的x与结束处的x不同。例如,在C中,假设您有一个变量,它有时以华氏度存储一个数字,然后将其转换为摄氏度,如下所示:
temp = 40;
temp = convertFtoC(temp);
温度=40;
温度=转换温度(温度);
然后你可以把它们看作两个不同的变量:
tempF = 40;
tempC= convertFtoC(tempF);
tempF=40;
tempC=转换温度(tempF);
如果不知道你的x和y将为他们发明更好的名字,你可能最终会用haskell写作:
xa = 1;
ya = 2;
xb = xa * ya;
yb = ya + xb;
xa=1;
ya=2;
xb=xa*ya;
yb=ya+xb;
在某些情况下,这可能是一种很好的方式来考虑如何使代码更具功能性和更少的强制性。另一种方式是考虑变量的“版本”——开始时的x与结束时的x不同。例如,在C中,假设您有一个变量,它有时以华氏度存储一个数字,然后将其转换为摄氏度,如下所示:
temp = 40;
temp = convertFtoC(temp);
温度=40;
温度=转换温度(温度);
然后你可以把它们看作两个不同的变量:
tempF = 40;
tempC= convertFtoC(tempF);
tempF=40;
tempC=转换温度(tempF);
如果不知道你的x和y将为他们发明更好的名字,你可能最终会用haskell写作:
xa = 1;
ya = 2;
xb = xa * ya;
yb = ya + xb;
xa=1;
ya=2;
xb=xa*ya;
yb=ya+xb;
在某些情况下,这可能是一种很好的方式来思考如何使代码更具功能性和更少的必要性。我只想修改变量的值。如果您有更多的上下文,这会有所帮助。为什么要重新指定x和y?在您的代码中,您根本不需要这样做,所以。。。当有人认为翻译是简单的x=2时,很难翻译它;y=4
如果您想使用允许重新分配变量的语言,Haskell可能不是一个好的选择。如果你想用Haskell的方式学习用Haskell编程,那么也许你应该重新考虑如何设计你的代码来完成你想做的事情。这只是一个例子。我不能在这里发布代码。我必须实现某事来模拟二传手/接球手的行为。@Bigba为什么你不能?至少有一个简单的例子来解释为什么需要这个功能可能会很有用。如果这是作业,请添加标记[Homegram]。我只想修改变量的值。如果您有更多上下文,这会有所帮助。为什么要重新指定x和y?在您的代码中,您根本不需要这样做,所以。。。当有人认为翻译是简单的x=2时,很难翻译它;y=4
如果您想使用允许重新分配变量的语言,Haskell可能不是一个好的选择。如果你想用Haskell的方式学习用Haskell编程,那么也许你应该重新考虑如何设计你的代码来完成你想做的事情。这只是一个例子。我不能在这里发布代码。我必须实现某事来模拟二传手/接球手的行为。@Bigba为什么你不能?至少有一个简单的例子来解释为什么需要这个功能可能会很有用。如果这是家庭作业,请添加标签[Homegram]。谷歌上查询“设置并进入haskell”的第一个结果将带我到。我猜翻译后的代码看起来像这里给出的一个具体示例。注意,这与C版本略有不同,因为在C代码中,x是在设置y之前修改的,而不是同时修改的,所以您可能需要put(1,2)>=modify(\(x,y)->(x*y,y))>=modify(\(x,y>)-(x,y+x))