Haskell Scott Wlaschin Thinkof数字示例
我正试图在haskell的函数式编程中找到自己的方法。 我看了Scott Wlaschin的这段精彩视频。 我试图用haskell实现他的ThinkOfNumber示例 我找到的唯一解决方案是:Haskell Scott Wlaschin Thinkof数字示例,haskell,Haskell,我正试图在haskell的函数式编程中找到自己的方法。 我看了Scott Wlaschin的这段精彩视频。 我试图用haskell实现他的ThinkOfNumber示例 我找到的唯一解决方案是: thinkOfANumber numberYouThoughtOf = (\x -> x - numberYouThoughtOf) . (\x -> x / numberYouThoughtOf)
thinkOfANumber numberYouThoughtOf = (\x -> x - numberYouThoughtOf)
. (\x -> x / numberYouThoughtOf)
. (\x -> x - 1)
. (\x -> x * x)
. (\x -> x + 1)
因此,我必须以这种方式调用函数,使用2个参数
thinkOfANumber 13 13
为了记住呼叫链中的号码Outhoughtof
我找到了一种简化代码的方法,使用类似管道的操作符,例如F#中的“|>”操作符
也许我确实错过了什么:)
当做
伊万
在nice Fyodor Soikin回复后编辑:
如果有人对Scott Wlaschin演示感兴趣,下面是toRomanNumerals示例的haskell解决方案:
import Data.List.Utils
infixl 5 |>
x |> f = f x
toRomanNumerals number =
let replicate_I = ['I' | _ <- [1 .. number]]
replace_IIIII_V = replace "IIIII" "V"
replace_VV_X = replace "VV" "X"
replace_XXXXX_L = replace "XXXXX" "L"
replace_LL_C = replace "LL" "C"
replace_CCCCC_D = replace "CCCCC" "D"
replace_DD_M = replace "DD" "M"
in replicate_I
|> replace_IIIII_V
|> replace_VV_X
|> replace_XXXXX_L
|> replace_LL_C
|> replace_CCCCC_D
|> replace_DD_M
import Data.List.Utils
infixl 5 |>
x |>f=fx
圆环数编号=
让我们复制_I=['I'|替换_uiiii_V
|>更换_VV_X
|>更换XXXXX
|>更换
|>更换“CCCCC”
|>替换\u DD\M
再次感谢fyodor soikin!来自数据。功能与F#管完全相似:
当然,如果您喜欢管道(我个人喜欢),您可以在Haskell中定义它:
infixl 5 |>
x |> f = f x
thinkOfANumber numberYonThoughOf =
let addOne x = x + 1
squareIt x = x * x
subtractOne x = x - 1
divideByTheNumberYouThoughtOf x = x / numberYonThoughOf
in numberYonThoughOf
|> addOne
|> squareIt
|> subtractOne
|> divideByTheNumberYouThoughtOf
从数据中。函数
是F#管的精确模拟:
当然,如果您喜欢管道(我个人喜欢),您可以在Haskell中定义它:
infixl 5 |>
x |> f = f x
thinkOfANumber numberYonThoughOf =
let addOne x = x + 1
squareIt x = x * x
subtractOne x = x - 1
divideByTheNumberYouThoughtOf x = x / numberYonThoughOf
in numberYonThoughOf
|> addOne
|> squareIt
|> subtractOne
|> divideByTheNumberYouThoughtOf
Fyodor Soikin认为&
对应于F#的>
,这是正确的,但阅读Haskell代码给我的印象是,使用$
运算符并从右到左进行组合被认为更为惯用,就像在数学中一样:
thinkOfANumber numberYouThoughOf =
let addOne x = x + 1
squareIt x = x * x
subtractOne x = x - 1
divideByTheNumberYouThoughtOf x = x / numberYouThoughOf
in divideByTheNumberYouThoughtOf $ subtractOne $ squareIt $ addOne numberYouThoughOf
Fyodor Soikin认为&
对应于F#的>
,这是正确的,但阅读Haskell代码给我的印象是,使用$
运算符并从右到左进行组合被认为更为惯用,就像在数学中一样:
thinkOfANumber numberYouThoughOf =
let addOne x = x + 1
squareIt x = x * x
subtractOne x = x - 1
divideByTheNumberYouThoughtOf x = x / numberYouThoughOf
in divideByTheNumberYouThoughtOf $ subtractOne $ squareIt $ addOne numberYouThoughOf
我的意思是,你可以把整件事写在一行中想想nx=(a*a-1)/n-n其中a=x+1
我认为这更适合F#pipe操作符,在控件中可以使用。Arrow
模块。您也可以尝试使用。@bradrn>控件中的
操作符。Arrow
实际上是合成,而F#pipe是反向应用。感谢您澄清@Fyodor Soikin-我不太熟悉F#。在这种情况下,(&)
确实是正确的选择,正如你在下面所说的。我的意思是,你可以把整个事情写在一行中想想nx=(a*a-1)/n-n其中a=x+1
我认为这更适合F#pipe操作符,在控件中可以使用。Arrow
模块。您也可以尝试使用。@bradrn>控件中的
操作符。Arrow
实际上是合成,而F#pipe是反向应用。感谢您澄清@Fyodor Soikin-我对F#不太熟悉。在这种情况下,(&)
确实是正确的选择,正如您在下面所说的。谢谢。非常好。谢谢。非常好。